test命令用于测试文件状态、数字和字符串,expr命令测试和执行数值输出。
退出状态可用$?查看,0表示正确,其他数字表示错误。
test
test命令有两种格式:
1 test <condition> 2 [ <condition> ]
注意:[]两端都要有空格。常用于测试文件状态的选项如下:
1 -d 目录 2 -s 文件长度大于0、非空 3 -f 正规文件 4 -w 可写 5 -L 符号连接 6 -u 文件有suid设置 7 -r 可读 8 -x 可执行
例子如下:
1 lee@ubuntu:~/shell_study/cu$ ls -al 2 总用量 16 3 drwxr-xr-x 2 lee lee 4096 2012-03-05 23:19 . 4 drwxr-xr-x 16 lee lee 4096 2012-05-26 13:43 .. 5 -rw-r--r-- 1 lee lee 41 2012-03-05 23:19 file1 6 -rw-r--r-- 1 lee lee 47 2012-03-05 23:19 file2 7 lee@ubuntu:~/shell_study/cu$ [ -x file1 ] 8 lee@ubuntu:~/shell_study/cu$ echo $? 9 1 10 lee@ubuntu:~/shell_study/cu$ [ -r file1 ] 11 lee@ubuntu:~/shell_study/cu$ echo $? 12 0
在测试时可以用逻辑操作符:
1 -a 逻辑与 2 -o 逻辑或 3 ! 逻辑否
字符串测试有5种格式:
1 test "<string>" 2 test <string_operator> "<string>" 3 test "<string>" <string_operator> "<string>" 4 [ <string_operator> <string> ] 5 [ <string> <string_operator> <string> ]
其中string_operator可以为下列之一,需要注意的是操作符两边都要有空格:
== 两个字符串相等 ,与 = 等价 != 两个字符串不等 -z 空串 -n 非空串
例子如下:
1 lee@ubuntu:~/shell_study/cu$ str="hello world" 2 lee@ubuntu:~/shell_study/cu$ echo $str 3 hello world 4 lee@ubuntu:~/shell_study/cu$ [ $str == "hello world" ] 5 bash: [: 过多的参数 6 lee@ubuntu:~/shell_study/cu$ [ "$str" == "hello world" ] 7 lee@ubuntu:~/shell_study/cu$ echo $? 8 0
需要注意的是,当字符串有空格时,要用双引号,使用双引号可引用除字符$、`、\外的任意字符或字符串。这些特殊字符分别为美元符号,反引号和反斜线,对s h e l l来说,它们有特殊意义。
在test的时候,如果变量str为空或者带有空格,则会出现第五行的错误,解决方案还是双引号,参考http://mywiki.wooledge.org/BashPitfalls。
另外,==的功能在[[]]和[]中的行为是不同的,如下:
1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true 2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true 3 [ $a == z* ] # File globbing 和word splitting将会发生 4 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true
格式如下:
1 [ "<number>" number_operator "<number>" ]
number_operator为:
1 -eq 数值相等。 2 -ne 数值不相等。 3 -gt 第一个数大于第二个数。 4 -lt 第一个数小于第二个数。 5 -le 第一个数小于等于第二个数。 6 -ge 第一个数大于等于第二个数。
expr
expr命令一般用于整数值,但是也可以用于字符串,格式为:
1 expr <argument> <operator> <argument>
例子:
1 lee@ubuntu:~/shell_study/cu$ expr 10 + 10 2 20 3 lee@ubuntu:~/shell_study/cu$ expr 10 - 10 4 0 5 lee@ubuntu:~/shell_study/cu$ expr 10 * 10 6 expr: 语法错误 7 lee@ubuntu:~/shell_study/cu$ expr 10 / 10 8 1 9 lee@ubuntu:~/shell_study/cu$ expr 10 \* 10 10 100
需要注意的是,为了避免shell的替代,乘法时要用反斜杠转义。
expr可以用于在循环中的计数,如下例:
1 lee@ubuntu:~/shell_study/cu$ loop=1 2 lee@ubuntu:~/shell_study/cu$ loop=`expr $loop + 1` 3 lee@ubuntu:~/shell_study/cu$ echo $loop 4 2
需要注意的是,expr的退出状态和shell的退出状态刚好相反,即expr中1表示正确退出,如:
1 lee@ubuntu:~/shell_study/cu$ value=hello 2 lee@ubuntu:~/shell_study/cu$ expr $value = "hello" 3 1 4 lee@ubuntu:~/shell_study/cu$ echo $? 5 0
格式:
1 expr <string> : <regular>
比如:
1 lee@ubuntu:~$ value=hello 2 lee@ubuntu:~$ expr $value : '.*' 3 5