全部博文(37)
分类: LINUX
2011-12-21 13:13:45
对文件、字符串和数字使用test命令。
对数字和字符串使用expr命令。
使用最后退出状态命令$?可测知test和expr,二者均以0表示正确,1表示返回错误。
1.1. 测试文件状态
test一般有两种格式,使用方括号时,要注意在条件两边加上空格:
test condition 或 [ condition ] |
常用测试文件状态的条件表达式:
-d 目录 -f 文件 -L 符号连接
-r 可读 -w 可写 -x 可执行
-s 文件长度大于0、非空 -u 文件有suid位设置 |
例如:
$ ll 总用量 16 drwxrwxr-x 3 wuzhiguo wuzhiguo 4096 2011-12-21 11:46 ./ drwxrwxr-x 7 wuzhiguo wuzhiguo 4096 2011-12-12 11:07 ../ -rw-rw-r-- 1 wuzhiguo wuzhiguo 0 2011-12-20 17:30 dst.txt drwxrwxr-x 2 wuzhiguo wuzhiguo 4096 2011-12-21 11:46 mydir/ -rwxrwxrwx 1 wuzhiguo wuzhiguo 245 2011-12-21 10:00 my.sh* lrwxrwxrwx 1 wuzhiguo wuzhiguo 5 2011-12-21 11:45 myshln -> my.sh* -rw-rw-r-- 1 wuzhiguo wuzhiguo 0 2011-12-20 17:29 src.txt $ test -d mydir $ echo $? 0 $ test -f src.txt $ echo $? 0 $ test -f mydir $ echo $? 1 $ test -L myshln $ echo $? 0 $ test -r src.txt $ echo $? 0 $ echo -w src.txt -w src.txt $ test -w src.txt $ echo -w src.txt -w src.txt $ echo $? 0 $ test -x src.txt $ echo $? 1 $ test -s src.txt $ echo $? 1 $ [ -d mydir ] $ echo $? 0 |
测试时使用逻辑操作符:
-a 逻辑与
-o 逻辑或
! 逻辑否
$ [ -d mydir -a -f src.txt ] $ echo $? 0 $ [ -d mydir -o -f src.txt ] $ echo $? 0 $ [ ! -d src.txt ] $ echo $? 0 $ [ ! -f src.txt ] $ echo $? 1
$ test -d mydir -a -f src.txt $ echo $? 0 $ test -d mydir -a -d src.txt $ echo $? 1 $ test ! -d mydir $ echo $? 1 |
1.2. 字符串测试
字符串测试
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。
字符串测试有5种格式:
test "string" test string_operator "string" test "string" string_operator "string" [ string_operator "string" ] [ "string" string_operator "string" ]
这里,stringoperator可为: = 两个字符串相等。 != 两个字符串不等。 -z 空串。 -n 非空串。 |
例如:
$ str1=12345 $ str2=45678 $ str3=12345 $ str4= $ [ $str1 = "12345" ] $ echo $? 0 $ [ $str1 != "12345" ] $ echo $? 1 $ [ $str1 == $str2 ] $ echo $? 1 $ [ $str1 != $str2 ] $ echo $? 0 $ [ -z $str1 ] $ echo $? 1 $ [ -z $str4 ] $ echo $? 0 $ [ -z "" ] $ echo $? 0 $ [ -n $str1 ] $ echo $? 0 $ [ -n "" ] $ echo $? 1 $ test $str1 = $str2 $ echo $? 1 $ |
1.3. 测试数值
测试数值可以使用许多操作符,一般格式如下:
test "number" numericoperator "number" 或者 [ "number" numericoperator "number" ] numericoperator 可为: -eq 数值相等。 -ne 数值不相等。 -gt 第一个数大于第二个数。 -lt 第一个数小于第二个数。 -le 第一个数小于等于第二个数。 -ge 第一个数大于等于第二个数。 |
例如:
$ [ 123 -eq 123 ] $ echo $? 0 $ [ 123 -ne 123 ] $ echo $? 1 $ [ 123 -gt 123 ] $ echo $? 1 $ [ 123 -lt 123 ] $ echo $? 1 $ [ 123 -ge 123 ] $ echo $? 0 $ [ 123 -le 123 ] $ echo $? 0 $ [ "123" -le "123" ] $ echo $? 0 $ [ "555" -le "12345" ] $ echo $? 0 $ |
1.4. expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument |
expr也是一个手工命令行计数器。:
$ expr 10 + 10 20 $ expr 100/3/3 100/3/3 $ expr 100 / 3 / 3 11 $ expr 2 \* 3 6 |
增量计数:
expr在循环中用于增量计算。首先,循环初始化为0,然后循环值加1,反引号的用法意即替代命令。最基本的一种是从expr命令接受输出并将之放入循环变量。
$ LOOP=0 $ LOOP=`expr $LOOP + 1` $ echo $LOOP 1 |
数值测试:
可以用expr测试一个整数。如果试图计算非整数,将返回错误。
$ N=123 $ expr $N + 1 > /dev/null 2>&1 $ echo $? 0 $ N=aaa $ expr $N + 1 > /dev/null 2>&1 $ echo $? 2
$ M=123 $ expr $M + 1 124 $ echo $? 0 $ M=aaa $ expr $M + 1 expr: non-integer argument $ echo $? 2 |
expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,expr返回1。不要混淆了,这表明成功。现在检验其最后退出状态,返回0表示测试成功。
$ str="hello" $ expr $str = "hello" 1 $ echo $? 0 |
模式匹配:
$ filename=accounts.doc $ expr $filename : '.*' 12 $ expr $filename : '\(.*\).doc' accounts $ expr $filename : '.*\(.doc\)' .doc |
这个还是不太懂,貌似()是提取的意思,先记下来。