測試文件狀態
test
test一般有兩種格式,即:
test condition
或
[ condition ]
使用方括號時,要注意在條件兩邊加上空格。測試文件狀態的條件表達式很多,但是最常用的可在下表中查到。
測試時使用邏輯操作符
測試文件狀態是否為OK,但是有時要比較兩個文件狀態。shell提供三種邏輯操作完成此功能。
-a 邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o 邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
! 邏輯否,條件為假,結果為真。
下面比較兩個文件sed.out、sed.txt:
字符串測試
字符串測試是錯誤捕獲很重要的一部分,特別在測試用戶輸入或比較變量時尤為重要。字符串測試有5種格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator "string" ]
[ "string" string_operator "string" ]
這里,string_operator可為:
測試數值
測試數值可以使用許多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可為:
可以不必將整數值放入變量,直接用數字比較即可,但要加引號。
expr用法
expr命令一般用于整數值,但也可用于字符串。一般格式為:
expr argument operator argument
expr也是一個手工命令行計數器。
使用乘號時,必須用反斜線屏蔽其特定含義。因為shell可能會誤解顯示星號的意義
增量計數expr在循環中用于增量計算。首先,循環初始化為 0,然后循環值加1,反引號的用法意即替代命令。最基本的一種是從(expr)命令接受輸出并將之放入循環變量
數值測試
可以用expr測試一個數。如果試圖計算非整數,將返回錯誤。
/
expr也可以返回其本身的退出狀態,不幸的是返回值與系統最后退出命令剛好相反,成功返回1,任何其他值為無效或錯誤。下面的例子測試兩個字符串是否相等,這里字符串為“hello”和“hello” 。
模式匹配
expr也有模式匹配功能。可以使用expr通過指定冒號選項計算字符串中字符數。.*意即任何字符重復0次或多次.
這里沒有搞懂,tomotoboy和nefu_luyanshen,明明存在而結果是0
test
test一般有兩種格式,即:
test condition
或
[ condition ]
使用方括號時,要注意在條件兩邊加上空格。測試文件狀態的條件表達式很多,但是最常用的可在下表中查到。
-d | 目錄 | -s | 文件長度大于0、非空 |
-f | 正規文件 | -w | 可寫 |
-L | 符號連接 | -u | 文件有suid位設置 |
-r | 可讀 | -x | 可執行 |
- /home/l/g/tomotoboy >test -d sed.out
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >test -f sed.out
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ -f sed.out ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ -d sed.out ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ -x sed.out ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ -r sed.out ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ -w sed.out ]
- /home/l/g/tomotoboy >echo $?
- 0
測試時使用邏輯操作符
測試文件狀態是否為OK,但是有時要比較兩個文件狀態。shell提供三種邏輯操作完成此功能。
-a 邏輯與,操作符兩邊均為真,結果為真,否則為假。
-o 邏輯或,操作符兩邊一邊為真,結果為真,否則為假。
! 邏輯否,條件為假,結果為真。
下面比較兩個文件sed.out、sed.txt:
- /home/l/g/tomotoboy >ls -al sed.out sed.txt
- -rw-r--r-- 1 tomotoboy member 159 Jul 30 16:47 sed.out
- -rw-r--r-- 1 tomotoboy member 655 Jul 31 14:44 sed.txt
- /home/l/g/tomotoboy >[ -w sed.out -a -w sed.txt ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt]
- -bash: [: missing `]'
- /home/l/g/tomotoboy >[ -x sed.out -a -r sed.txt ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ -x sed.out -o -r sed.txt ]
- /home/l/g/tomotoboy >echo $?
- 0
字符串測試
字符串測試是錯誤捕獲很重要的一部分,特別在測試用戶輸入或比較變量時尤為重要。字符串測試有5種格式:
test "string"
test string_operator "string"
test "string" string_operator "string"
[ string_operator "string" ]
[ "string" string_operator "string" ]
這里,string_operator可為:
= | 兩個字符串相等。 |
!= | 兩個字符串不等。 |
-z | 空串。 |
-n | 非空串。 |
- /home/l/g/tomotoboy >[ -z $HELLO ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >HELLO="hello"
- /home/l/g/tomotoboy >[ -z $HELLO ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ -n $HELLO ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ !-n $HELLO ]
- [ nohup -p 1 $HELLO ]
- -bash: [: too many arguments
- /home/l/g/tomotoboy >[ ![ -n $HELLO ] ]
- [ [ -z $HELLO ] -n $HELLO ] ]
- -bash: [: too many arguments
- /home/l/g/tomotoboy >HI="hi"
- /home/l/g/tomotoboy >[ $HELLO = $HI]
- -bash: [: missing `]'
- /home/l/g/tomotoboy >[ $HELLO = $HI ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ $HELLO != $HI ]
- /home/l/g/tomotoboy >echo $?
- 0
測試數值
測試數值可以使用許多操作符,一般格式如下:
"number" numeric_operator "number"
或者
[ "number" numeric_operator "number" ]
numeric_operator可為:
-eq | 數值相等。 |
-ne | 數值不相等。 |
-gt | 第一個數大于第二個數。 |
-lt | 第一個數小于第二個數。 |
-le | 第一個數小于等于第二個數。 |
-ge | 第一個數大于等于第二個數。 |
- /home/l/g/tomotoboy >Nbr=10
- /home/l/g/tomotoboy >Nbr1=20
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >Nbr -ne Nbr1
- -bash: Nbr: command not found
- /home/l/g/tomotoboy >$Nbr -ne $Nbr1
- -bash: 10: command not found
- /home/l/g/tomotoboy >[ "$Nbr" -ne "$Nbr1" ]
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ "$Nbr" -e "$Nbr1" ]
- -bash: [: -e: binary operator expected
- /home/l/g/tomotoboy >[ "$Nbr" -eq "$Nbr1" ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]
- /home/l/g/tomotoboy >echo 4?
- 4?
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >[ "$Nbr" -gt "$Nbr1" ]
- /home/l/g/tomotoboy >echo $?
- 1
- /home/l/g/tomotoboy >[ "$Nbr" -lt "$Nbr1" ]
- /home/l/g/tomotoboy >echo $?
- 0
可以不必將整數值放入變量,直接用數字比較即可,但要加引號。
- /home/l/g/tomotoboy >[ "99" -ge "60" ]
- /home/l/g/tomotoboy >echo $?
- 0
expr用法
expr命令一般用于整數值,但也可用于字符串。一般格式為:
expr argument operator argument
expr也是一個手工命令行計數器。
- /home/l/g/tomotoboy >expr 10 + 10
- 20
- /home/l/g/tomotoboy >expr 45 / 4
- 11
使用乘號時,必須用反斜線屏蔽其特定含義。因為shell可能會誤解顯示星號的意義
- /home/l/g/tomotoboy >expr 30 \* 100
- 3000
增量計數expr在循環中用于增量計算。首先,循環初始化為 0,然后循環值加1,反引號的用法意即替代命令。最基本的一種是從(expr)命令接受輸出并將之放入循環變量
- /home/l/g/tomotoboy >loop=0
- /home/l/g/tomotoboy >loop=`expr $loop + 1`
- /home/l/g/tomotoboy >echo
- /home/l/g/tomotoboy >echo $?
- 0
- /home/l/g/tomotoboy >echo $loop
- 1
可以用expr測試一個數。如果試圖計算非整數,將返回錯誤。
/
- home/l/g/tomotoboy >f=1.1
- /home/l/g/tomotoboy >expr f + 10
- expr: non-numeric argument
- /home/l/g/tomotoboy >echo $?
- 2
- /home/l/g/tomotoboy >expr $HELLO + 10
- expr: non-numeric argument
- /home/l/g/tomotoboy >echo $?
- 2
- /home/l/g/tomotoboy >expr "$HELLO" + 10
- expr: non-numeric argument
- /home/l/g/tomotoboy >echo $?
- 2
- /home/l/g/tomotoboy >expr $f + 10
- expr: non-numeric argument
expr也可以返回其本身的退出狀態,不幸的是返回值與系統最后退出命令剛好相反,成功返回1,任何其他值為無效或錯誤。下面的例子測試兩個字符串是否相等,這里字符串為“hello”和“hello” 。
- /home/l/g/tomotoboy >expr $HELLO = "hello"
- 1
- /home/l/g/tomotoboy >echo $?
- 0
模式匹配
expr也有模式匹配功能。可以使用expr通過指定冒號選項計算字符串中字符數。.*意即任何字符重復0次或多次.
- /home/l/g/tomotoboy >cat sed.txt
- 605408211 pts/16 Jul 31 13:54 (218.0.1.42)
- caodejun pts/44 Jul 31 14:16 (219.148.133.31)
- duke1988 pts/45 Jul 31 14:41 (218.104.163.66)
- liuzk423 pts/6 Jul 20 08:27 (219.245.104.240)
- nefu_luyanshen pts/23 Jul 31 14:33 (218.25.6.142)
- nefu_luyanshen pts/48 Jul 31 12:59 (218.25.6.142)
- shuzigui pts/21 Jul 31 12:11 (121.35.248.193)
- tomotoboy pts/41 Jul 31 13:31 (219.221.99.155)
- waterlooz pts/25 Jul 31 08:48 (121.0.29.225)
- wsoangel pts/35 Jul 31 13:40 (116.233.219.10)
- xp55699312 pts/42 Jul 31 14:12 (61.152.132.103)
- zyy0904 pts/43 Jul 31 13:53 (125.33.195.36)
- /home/l/g/tomotoboy >VALUE=sed.txt
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'
- expr: syntax error
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy
- 0
- /home/l/g/tomotoboy >
- /home/l/g/tomotoboy >expr $VALUE:tomotoboy
- sed.txt:tomotoboy
- /home/l/g/tomotoboy >expr $VALUE: tomotoboy
- expr: syntax error
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy
- 0
- /home/l/g/tomotoboy >expr $VALUE :tomotoboy
- expr: syntax error
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy
- 0
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy, '.*'
- expr: syntax error
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy , '.*'
- expr: syntax error
- /home/l/g/tomotoboy >expr $VALUE : '.*'
- 7
- /home/l/g/tomotoboy >expr $VALUE : tomotoboy
- 0
- /home/l/g/tomotoboy >expr $VALUE : "tomotoboy"
- 0
- /home/l/g/tomotoboy >expr $VALUE : "nefu_luyanshen"
- 0