Shell脚本深入教程(1):快速入门 (4)

既然进程替换是文件,那么它就可以像文件一样被操作。比如被读取、被当作标准输入重定向的数据源等等:

# cmd做数据产生者 $ cat <(echo ) # 等价于cat /dev/fd/63 $ cat < <(echo ) # 等价于cat </dev/fd/63 # cmd做数据接收者 $ echo hello world > >(grep 'llo') $ echo hello world | tee >(grep 'llo') >(grep 'rld') >/dev/null 条件测试语句

test命令或功能等价的Bash内置命令[ ]可以做条件测试,如果测试的结果为True,则退出状态码为0。

此外,还可以使用[[]]来做条件测试,甚至let、$[]、$(())也可以做条件测试,但这里暂不介绍。

这些条件测试常用在if、while语句中,也常用在cmd1 && cmd2 || cmd3格式的命令行中。

用法示例:

sh_file=test.sh [ -x "$sh_file" ] && ./$sh_file || { echo "can't execute,exit...";exit 1; } test -x "$sh_file" && ./$sh_file || { echo "can't execute,exit...";exit 1; }

[]中的条件测试需要和开闭中括号使用空格隔开,否则语法解析错误(解析成通配符号)。

无测试内容 [ ] test

没有任何测试内容时,直接返回false。

true和false命令

true命令直接返回true,即退出状态码为0。

false命令直接返回false,即退出状态码非0。

$ true $ echo $? # 0 $ false $ echo $? # 1 文件类测试 条件表达式 含义
-e file   文件是否存在(exist)  
-f file   文件是否存在且为普通文件(file)  
-d file   文件是否存在且为目录(directory)  
-b file   文件是否存在且为块设备block device  
-c file   文件是否存在且为字符设备character device  
-S file   文件是否存在且为套接字文件Socket  
-p file   文件是否存在且为命名管道文件FIFO(pipe)  
-L file   文件是否存在且是一个链接文件(Link)  
文件属性类测试 条件表达式 含义
-r file   文件是否存在且当前用户可读  
-w file   文件是否存在且当前用户可写  
-x file   文件是否存在且当前用户可执行  
-s file   文件是否存在且大小大于0字节,即检测文件是否非空文件  
-N file   文件是否存在,且自上次read后是否被modify  
两文件之间的比较 条件表达式 含义
file1 -nt file2   (newer than)判断file1是否比file2新  
file1 -ot file2   (older than)判断file1是否比file2旧  
file1 -ef file2   (equal file)判断file1与file2是否为同一文件  
数值大小比较 条件表达式 含义
int1 -eq int2   两数值相等(equal)  
int1 -ne int2   两数值不等(not equal)  
int1 -gt int2   n1大于n2(greater than)  
int1 -lt int2   n1小于n2(less than)  
int1 -ge int2   n1大于等于n2(greater than or equal)  
int1 -le int2   n1小于等于n2(less than or equal)  
字符串比较 条件表达式 含义
-z str   (zero)判定字符串是否为空?str为空串,则true  
str
-n str
  判定字符串是否非空?str为串,则false。注:-n可省略  
str1 = str2
str1 == str2
  str1和str2是否相同,相同则返回true。"=="和"="等价  
str1 != str2   str1是否不等于str2,若不等,则返回true  
str1 > str2   str1字母顺序是否大于str2,若大于则返回true  
str1 < str2   str1字母顺序是否小于str2,若小于则返回true  
逻辑运算符 条件表达式 含义
-a或&&   (and)两表达式同时为true时才为true。
"-a"只能在test或[]中使用,&&只能在[[]]中使用
 
-o或||   (or)两表达式任何一个true则为true。
"-o"只能在test或[]中使用,||只能在[[]]中使用
 
!   对表达式取反  
( )   改变表达式的优先级,为了防止被shell解析,应加上反斜线转义( )  
if语句 if test-commands; then consequent-commands; [elif more-test-commands; then more-consequents;] [else alternate-consequents;] fi

test-commands既可以是test测试或[]、[[]]测试,也可以是任何其它命令,test-commands用于条件测试,它只判断命令的退出状态码是否为0,为0则为true。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwzjd.html