条件制御(test,expr......)

8585 ワード

テストファイルのステータス
test
testには一般的に2つのフォーマットがあります.すなわち、
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かどうかをテストしますが、2つのファイルのステータスを比較する場合があります.shellは、この機能を完了する3つの論理操作を提供します.
-a論理と、オペレータの両方が真であり、結果が真であり、そうでなければ偽である.
-o論理または、オペレータの両側が真であり、結果が真であり、そうでなければ偽である.
! 論理いいえ、条件は偽で、結果は真です.
2つのファイルを比較します.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は、次のいずれかです.
=    
2つの文字列が等しい.
!=   
2つの文字列が等しくありません.
-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  
1番目の数は2番目の数より大きい.
-lt  
1番目の数は2番目の数より小さい.
-le  
1番目の数は2番目の数以下です.
-ge  
1番目の数は2番目の数より大きい.
/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を正常に返し、他の値は無効またはエラーです.次の例では、2つの文字列が等しいかどうかをテストします.ここで、文字列は「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
ここでは分からなかったtomotoboyとnefuluyanshen,存在するのに結果は0