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