无线&移动互联网技术研发

换位思考·····
posts - 19, comments - 53, trackbacks - 0, articles - 283
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

条件控制(test,expr……)

Posted on 2009-11-29 12:01 Gavin.lee 阅读(339) 评论(0)  编辑  收藏 所属分类: Linux shell 入门

 

测试文件状态
test
test一般有两种格式,即:
test condition

[ condition ]
使用方括号时,要注意在条件两边加上空格。测试文件状态的条件表达式很多,但是最常用的可在下表中查到。
-d 目录 -s 文件长度大于0、非空
-f 正规文件 -w 可写
-L 符号连接 -u 文件有suid位设置
-r 可读 -x 可执行

Shell代码
  1. /home/l/g/tomotoboy >test -d sed.out   
  2. /home/l/g/tomotoboy >echo $?   
  3. 1  
  4.   
  5. /home/l/g/tomotoboy >test -f sed.out   
  6. /home/l/g/tomotoboy >echo $?   
  7. 0  
  8.   
  9. /home/l/g/tomotoboy >[ -f sed.out ]   
  10. /home/l/g/tomotoboy >echo $?   
  11. 0  
  12. /home/l/g/tomotoboy >[ -d sed.out ]   
  13. /home/l/g/tomotoboy >echo $?   
  14. 1  
  15.   
  16. /home/l/g/tomotoboy >[ -x sed.out ]   
  17. /home/l/g/tomotoboy >echo $?   
  18. 1  
  19.   
  20. /home/l/g/tomotoboy >[ -r sed.out ]   
  21. /home/l/g/tomotoboy >echo $?   
  22. 0  
  23.   
  24. /home/l/g/tomotoboy >[ -w sed.out ]   
  25. /home/l/g/tomotoboy >echo $?   
  26. 0  

测试时使用逻辑操作符
测试文件状态是否为OK,但是有时要比较两个文件状态。shell提供三种逻辑操作完成此功能。
-a   逻辑与,操作符两边均为真,结果为真,否则为假。
-o   逻辑或,操作符两边一边为真,结果为真,否则为假。
! 逻辑否,条件为假,结果为真。
下面比较两个文件sed.out、sed.txt:
Shell代码
  1. /home/l/g/tomotoboy >ls -al sed.out sed.txt   
  2. -rw-r--r--   1 tomotoboy member       159 Jul 30 16:47 sed.out   
  3. -rw-r--r--   1 tomotoboy member       655 Jul 31 14:44 sed.txt   
  4. /home/l/g/tomotoboy >[ -w sed.out -a -w sed.txt ]   
  5. /home/l/g/tomotoboy >echo $?   
  6. 0  
  7.   
  8. /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt]   
  9. -bash: [: missing `]'   
  10. /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 1  
  13.   
  14. /home/l/g/tomotoboy >[ -x sed.out -o -r sed.txt ]   
  15. /home/l/g/tomotoboy >echo $?   
  16. 0  

字符串测试
字符串测试是错误捕获很重要的一部分,特别在测试用户输入或比较变量时尤为重要。字符串测试有5种格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator "string" ]
[ "string" string_operator "string" ]
这里,string_operator可为:
=     两个字符串相等。
!=    两个字符串不等。
-z    空串。
-n    非空串。

Shell代码
  1. /home/l/g/tomotoboy >[ -z $HELLO ]   
  2. /home/l/g/tomotoboy >echo $?   
  3. 0  
  4.   
  5. /home/l/g/tomotoboy >HELLO="hello"  
  6. /home/l/g/tomotoboy >[ -z $HELLO ]   
  7. /home/l/g/tomotoboy >echo $?   
  8. 1  
  9.   
  10. /home/l/g/tomotoboy >[ -n $HELLO ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 0  
  13.   
  14. /home/l/g/tomotoboy >[ !-n $HELLO ]   
  15. [ nohup -p 1 $HELLO ]   
  16. -bash: [: too many arguments   
  17. /home/l/g/tomotoboy >[ ![ -n $HELLO ] ]   
  18. [ [ -z $HELLO ] -n $HELLO ] ]   
  19. -bash: [: too many arguments   
  20. /home/l/g/tomotoboy >HI="hi"  
  21. /home/l/g/tomotoboy >[ $HELLO = $HI]   
  22. -bash: [: missing `]'   
  23. /home/l/g/tomotoboy >[ $HELLO = $HI ]   
  24. /home/l/g/tomotoboy >echo $?   
  25. 1  
  26.   
  27. /home/l/g/tomotoboy >[ $HELLO != $HI ]   
  28. /home/l/g/tomotoboy >echo $?   
  29. 0  

测试数值
测试数值可以使用许多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可为:
-eq   数值相等。
-ne   数值不相等。
-gt   第一个数大于第二个数。
-lt   第一个数小于第二个数。
-le   第一个数小于等于第二个数。
-ge   第一个数大于等于第二个数。

Shell代码
  1. /home/l/g/tomotoboy >Nbr=10  
  2. /home/l/g/tomotoboy >Nbr1=20  
  3. /home/l/g/tomotoboy >echo $?   
  4. 0  
  5.   
  6. /home/l/g/tomotoboy >Nbr -ne Nbr1   
  7. -bash: Nbr: command not found   
  8. /home/l/g/tomotoboy >$Nbr -ne $Nbr1   
  9. -bash: 10: command not found   
  10. /home/l/g/tomotoboy >[ "$Nbr" -ne "$Nbr1" ]   
  11. /home/l/g/tomotoboy >echo $?   
  12. 0  
  13.   
  14. /home/l/g/tomotoboy >[ "$Nbr" -e "$Nbr1" ]   
  15. -bash: [: -e: binary operator expected   
  16. /home/l/g/tomotoboy >[ "$Nbr" -eq "$Nbr1" ]   
  17. /home/l/g/tomotoboy >echo $?   
  18. 1  
  19. /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]   
  20. /home/l/g/tomotoboy >echo 4?   
  21. 4?   
  22. /home/l/g/tomotoboy >echo $?   
  23. 0  
  24.   
  25. /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]   
  26. /home/l/g/tomotoboy >echo $?   
  27. 1  
  28.   
  29. /home/l/g/tomotoboy >[ "$Nbr" -lt "$Nbr1" ]   
  30. /home/l/g/tomotoboy >echo $?   
  31. 0  

可以不必将整数值放入变量,直接用数字比较即可,但要加引号。
Shell代码
  1. /home/l/g/tomotoboy >[ "99" -ge "60" ]   
  2. /home/l/g/tomotoboy >echo $?   
  3. 0  


expr用法
expr命令一般用于整数值,但也可用于字符串。一般格式为:
expr argument operator argument
expr也是一个手工命令行计数器。
Shell代码
  1. /home/l/g/tomotoboy >expr 10 + 10  
  2. 20  
  3.   
  4. /home/l/g/tomotoboy >expr 45 / 4  
  5. 11  

使用乘号时,必须用反斜线屏蔽其特定含义。因为shell可能会误解显示星号的意义
Shell代码
  1. /home/l/g/tomotoboy >expr 30 \* 100  
  2. 3000  

增量计数expr在循环中用于增量计算。首先,循环初始化为 0,然后循环值加1,反引号的用法意即替代命令。最基本的一种是从(expr)命令接受输出并将之放入循环变量
Shell代码
  1. /home/l/g/tomotoboy >loop=0  
  2. /home/l/g/tomotoboy >loop=`expr $loop + 1`   
  3. /home/l/g/tomotoboy >echo   
  4.   
  5. /home/l/g/tomotoboy >echo $?   
  6. 0  
  7. /home/l/g/tomotoboy >echo $loop   
  8. 1  
数值测试
可以用expr测试一个数。如果试图计算非整数,将返回错误。
/
Shell代码
  1. home/l/g/tomotoboy >f=1.1  
  2. /home/l/g/tomotoboy >expr f + 10  
  3. expr: non-numeric argument   
  4. /home/l/g/tomotoboy >echo $?   
  5. 2  
  6.   
  7. /home/l/g/tomotoboy >expr $HELLO + 10  
  8. expr: non-numeric argument   
  9. /home/l/g/tomotoboy >echo $?   
  10. 2  
  11.   
  12. /home/l/g/tomotoboy >expr "$HELLO"  + 10  
  13. expr: non-numeric argument   
  14. /home/l/g/tomotoboy >echo $?   
  15. 2  
  16.   
  17. /home/l/g/tomotoboy >expr $f + 10  
  18. expr: non-numeric argument  

expr也可以返回其本身的退出状态,不幸的是返回值与系统最后退出命令刚好相反,成功返回1,任何其他值为无效或错误。下面的例子测试两个字符串是否相等,这里字符串为“hello”和“hello” 。

Shell代码
  1. /home/l/g/tomotoboy >expr $HELLO = "hello"  
  2. 1  
  3. /home/l/g/tomotoboy >echo $?   
  4. 0  

模式匹配
expr也有模式匹配功能。可以使用expr通过指定冒号选项计算字符串中字符数。.*意即任何字符重复0次或多次.
Shell代码
  1. /home/l/g/tomotoboy >cat sed.txt   
  2. 605408211   pts/16       Jul 31 13:54   (218.0.1.42)   
  3. caodejun   pts/44       Jul 31 14:16    (219.148.133.31)   
  4. duke1988   pts/45       Jul 31 14:41    (218.104.163.66)   
  5. liuzk423   pts/6        Jul 20 08:27    (219.245.104.240)   
  6. nefu_luyanshen   pts/23       Jul 31 14:33      (218.25.6.142)   
  7. nefu_luyanshen   pts/48       Jul 31 12:59      (218.25.6.142)   
  8. shuzigui   pts/21       Jul 31 12:11    (121.35.248.193)   
  9. tomotoboy   pts/41       Jul 31 13:31   (219.221.99.155)   
  10. waterlooz   pts/25       Jul 31 08:48   (121.0.29.225)   
  11. wsoangel   pts/35       Jul 31 13:40    (116.233.219.10)   
  12. xp55699312   pts/42       Jul 31 14:12  (61.152.132.103)   
  13. zyy0904    pts/43       Jul 31 13:53    (125.33.195.36)   
  14.   
  15. /home/l/g/tomotoboy >VALUE=sed.txt   
  16. /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'  
  17. expr: syntax error   
  18. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  19. 0  
  20.   
  21. /home/l/g/tomotoboy >   
  22. /home/l/g/tomotoboy >expr $VALUE:tomotoboy   
  23. sed.txt:tomotoboy   
  24. /home/l/g/tomotoboy >expr $VALUE: tomotoboy   
  25. expr: syntax error   
  26. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  27. 0  
  28. /home/l/g/tomotoboy >expr $VALUE :tomotoboy   
  29. expr: syntax error   
  30. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  31. 0  
  32. /home/l/g/tomotoboy >expr $VALUE : tomotoboy, '.*'  
  33. expr: syntax error   
  34. /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'  
  35. expr: syntax error   
  36.   
  37. /home/l/g/tomotoboy >expr $VALUE :  '.*'  
  38. 7  
  39.   
  40. /home/l/g/tomotoboy >expr $VALUE : tomotoboy   
  41. 0  
  42.   
  43. /home/l/g/tomotoboy >expr $VALUE : "tomotoboy"  
  44. 0  
  45.   
  46. /home/l/g/tomotoboy >expr $VALUE : "nefu_luyanshen"  
  47. 0  
这里没有搞懂,tomotoboy和nefu_luyanshen,明明存在而结果是0

只有注册用户登录后才能发表评论。


网站导航: