無線&移動互聯網技術研發

          換位思考·····
          posts - 19, comments - 53, trackbacks - 0, articles - 283
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          條件控制(test,expr……)

          Posted on 2009-11-29 12:01 Gavin.lee 閱讀(365) 評論(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
          主站蜘蛛池模板: 靖安县| 德钦县| 东海县| 平山县| 枣庄市| 贵港市| 新郑市| 思南县| 黔南| 凤翔县| 哈尔滨市| 湖南省| 呼图壁县| 盐津县| 板桥市| 安义县| 焦作市| 仁化县| 安阳市| 中方县| 虞城县| 东阳市| 长治市| 阳泉市| 潼关县| 天柱县| 石城县| 苏尼特左旗| 探索| 正阳县| 博客| 夏津县| 太谷县| 衡阳市| 旅游| 锡林浩特市| 资源县| 伊春市| 民权县| 珠海市| 阳春市|