Linuxスクリプトコマンド状態条件テスト


Linuxスクリプト:
スクリプトは一般的にテキストファイルであり、実行スクリプトは実際にbashプロセスを実行し、このプロセスはスクリプトファイルから実行ロジックを読み出し、bashプロセスがこのロジックを解析して実行します.
起動スクリプト:
(1) # bash/PATH/TO/SCRIPT_FILE
(2)実行権限
# ./PATH/TO/SCRIPT_FILE 
[root@iZ28qzns9m4Z ~]# vi date.sh 
[root@iZ28qzns9m4Z ~]# sh date.sh  # 
Thu, 17 Sep 2015 12:43:37 +0800
[root@iZ28qzns9m4Z ~]# ll
total 4
-rw-r--r-- 1 root root 22 Sep 17 12:43 date.sh
[root@iZ28qzns9m4Z ~]# chmod +x date.sh  # 
[root@iZ28qzns9m4Z ~]# ll
total 4
-rwxr-xr-x 1 root root 22 Sep 17 12:43 date.sh
[root@iZ28qzns9m4Z ~]# ./date.sh 
Thu, 17 Sep 2015 12:44:05 +0800
[root@iZ28qzns9m4Z ~]#

bashスクリプトの一般的なオプション:
  • -n:スクリプト内の構文エラーをチェックします.
  • -x:実行スクリプトをデバッグします.

  • コマンドステータスの結果:
    bashプロセスは、実行されたコマンドが成功したかどうかを追跡するために使用されます.
    0:成功
    1-255:失敗
    [root@iZ28qzns9m4Z ~]# vim date.sh 
    [root@iZ28qzns9m4Z ~]# sh -n date.sh 
    [root@iZ28qzns9m4Z ~]# sh -x date.sh 
    + date -s
    date: option requires an argument -- 's'
    Try 'date --help' for more information.
    [root@iZ28qzns9m4Z ~]# vi date.sh 
    [root@iZ28qzns9m4Z ~]# sh -n date.sh 
    [root@iZ28qzns9m4Z ~]# sh -x date.sh 
    + date -R
    Thu, 17 Sep 2015 14:36:06 +0800
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]# vi date.sh 
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]# sh  date.sh 
    date: option requires an argument -- 's'
    Try 'date --help' for more information.
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]#

    カスタムスクリプトのステータス結果:
    exit n
    [root@localhost bashtest]# vim t1.sh 
    [root@localhost bashtest]# sh -x t1.sh 
    + useradd test001
    useradd: user 'test001' already exists
    + echo test001
    + passwd --stdin test001
    Changing password for user test001.
    passwd: all authentication tokens updated successfully.
    + exit 9
    [root@localhost bashtest]# echo $?
    9
    [root@localhost bashtest]#

    注:スクリプト内の任意の場所でexitコマンドが実行されると、現在のshellプロセスが終了します.
    条件テスト:test
    プログラム実行環境を定義する.
    (1)実行したコマンドの状態結果による.
    (2)テスト式
    testコマンド
    [スペースコマンドスペース]
    [[スペースコマンドスペース]]
    [root@iZ28qzns9m4Z ~]# test -e /test
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]# [ -e /test ]
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]#
    [root@iZ28qzns9m4Z ~]# [[ -e /var ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]#

    整数テスト:数値サイズの比較を隠しているので、変数参照に参照を付けないでください.
    $A-gt$B:より大きいかどうか;はいは「真」で、そうでなければ「偽」です.
    $A-ge$B:等しいかどうか;
    $A-lt$B:小さいかどうか;
    $A-le$B:等しいかどうか;
    $A-eq$B:等しいかどうか;
    $A-ne$B:等しくないかどうか;
    [root@iZ28qzns9m4Z ~]# a=9
    [root@iZ28qzns9m4Z ~]# b=12
    [root@iZ28qzns9m4Z ~]# [[ $a -gt $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]# [[ $a -ge $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]# [[ $a -lt $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]# [[ $a -le $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]# [[ $a -eq $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    1
    [root@iZ28qzns9m4Z ~]# [[ $a -ne $b ]]
    [root@iZ28qzns9m4Z ~]# echo $?
    0
    [root@iZ28qzns9m4Z ~]#

    文字列テスト:
    「$A」>「$B」:より大きいかどうか;
    「$A」<「$B」:より小さいかどうか;
    「$A」=「$B」:等しいかどうか;
    "$A"!= 「$B」:等しくないかどうか;
    -z'$A':空かどうか;空は「真」、そうでなければ「偽」
    -n'$A':空でないかどうか;空でなければ真、空であれば偽
    [root@iZ28qzns9m4Z ~]# a=glancesli  #103 108 97 110 99 101 115 108 105
    [root@iZ28qzns9m4Z ~]# b=nancy   #110 97 110 99 121
    [root@iZ28qzns9m4Z ~]# test "$a" = "$b" && echo Ture||echo false
    false
    [root@iZ28qzns9m4Z ~]# [ "$a" == "$b" ] && echo Ture || echo false
    false
    [root@iZ28qzns9m4Z ~]# [ "$a" != "$b" ] && echo Ture || echo false
    Ture
    [root@iZ28qzns9m4Z ~]# [ -z "$a" ] && echo Ture || echo false
    false
    [root@iZ28qzns9m4Z ~]# [ -n "$a" ] && echo Ture || echo false
    Ture
    [root@iZ28qzns9m4Z ~]# test "$a" \> "$b" && echo ture||echo false
    false
    [root@iZ28qzns9m4Z ~]# test "$a" \< "$b" && echo ture||echo false
    ture
    [root@iZ28qzns9m4Z ~]# [[ "$a" < "$b" ]] && echo Ture || echo false
    Ture
    [root@iZ28qzns9m4Z ~]# [[ "$a" > "$b" ]] && echo Ture || echo false
    false
    [root@iZ28qzns9m4Z ~]#

    注意:文字列の比較が小さい場合は、エスケープする必要があります.すなわち、逆斜線を付けます.文字列比較の順序はASCII表の順で、大文字は小文字の値より小さい.
    ファイルテスト:ファイルの存在と属性をテストします.
    -e$file:存在するかどうか;存在する場合は「真」であり、そうでない場合は「偽」である.
    -a$file:上;
    -f$file:ファイルが存在し、通常のファイルであるか.
    -d$file:ファイルが存在し、ディレクトリであるか.
    -h$file:シンボルリンクファイルが存在するかどうか;
    -L$file:同上
    -b$file:存在し、ブロックデバイスファイルであるか.
    -c$file:存在し、文字デバイスファイルであるかどうか.
    -S$file:存在し、ソケットファイルであるか.
    -p$file:パイプファイルとして存在するかどうか;
    -r$file:現在のユーザーがファイルに対して読み取り権限を持っているかどうか.
    -w$file:現在のユーザーがファイルに書き込み権限を持っているかどうか.
    -x$file:現在のユーザーがファイルに対して実行権限を持っているかどうか;
    -u$file:ファイルにSUID権限があるかどうか;
    -g$file:ファイルにSGID権限があるかどうか;
    -k$file:ファイルにsticky権限があるかどうか;
    -O$file:現在のユーザーが指定したファイルの所有者であるかどうか.
    -G$file:現在のユーザが指定されたファイルのグループであるかどうか;
    [root@iZ28qzns9m4Z home]# mkdir abc
    [root@iZ28qzns9m4Z home]# ll
    total 12
    drwxr-xr-x 2 root    root    4096 Sep 17 17:13 abc
    drwxr-xr-x 2 root    root    4096 Sep 17 17:01 bashtest
    drwx------ 2 user001 user001 4096 Sep 17 15:13 user001
    [root@iZ28qzns9m4Z home]# test -e abc
    [root@iZ28qzns9m4Z home]# test -e abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -e bcd && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -a bcd && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -a abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -f abc && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -d abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# ln -s abc/ cde
    [root@iZ28qzns9m4Z home]# ll
    total 12
    drwxr-xr-x 2 root    root    4096 Sep 17 17:13 abc
    drwxr-xr-x 2 root    root    4096 Sep 17 17:01 bashtest
    lrwxrwxrwx 1 root    root       4 Sep 17 17:15 cde -> abc/
    drwx------ 2 user001 user001 4096 Sep 17 15:13 user001
    [root@iZ28qzns9m4Z home]# test -h abc && echo true || echo false
    false
    [root@iZ28qzns9m4Z etc]# test -L system-release && echo true || echo false
    true
    [root@iZ28qzns9m4Z etc]# test -h system-release && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -b abc && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -c abc && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -r abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# vim te1.sh
    [root@iZ28qzns9m4Z home]# test -rxw abc && echo true || echo false
    -bash: test: -rxw: unary operator expected
    false
    [root@iZ28qzns9m4Z home]# test -w abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -x abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -u abc && echo true || echo false
    false
    [root@iZ28qzns9m4Z home]# test -O abc && echo true || echo false
    true
    [root@iZ28qzns9m4Z home]# test -G abc && echo true || echo false
    true

    双眼オペレータ:
    $file 1-nt$file 2:file 1がfile 2に新しいかどうか、file 1の最近の変更タイムスタンプがfile 2より遅いかどうか.
    $file 1-ot$file 2:file 1がfile 2より古いかどうか、file 1の最近の変更タイムスタンプがfile 2より早いかどうか. 
    $file 1-ef$file 2:file 1とfile 2が同じinodeを指しているかどうか.両方が同じファイルのハードリンクであるかどうかをテストします.
    [root@iZ28qzns9m4Z bashtest]# ll
    total 8
    -rwxr-xr-x 1 root root 140 Sep 17 15:42 1.sh
    -rw-r--r-- 1 root root  74 Sep 17 15:43 2.sh
    -rw-r--r-- 1 root root   0 Sep 17 17:01 nancy
    [root@iZ28qzns9m4Z bashtest]# test 2.sh \-ot 1.sh && echo true || echo false
    false
    [root@iZ28qzns9m4Z bashtest]# test 2.sh \-nt 1.sh && echo true || echo false
    true
    [root@iZ28qzns9m4Z bashtest]# test 2.sh \-ef 1.sh && echo true || echo false
    false
    [root@iZ28qzns9m4Z bashtest]# 
    [root@iZ28qzns9m4Z bashtest]# ln -s nancy n1.sh
    [root@iZ28qzns9m4Z bashtest]# ln -s nancy n2.sh
    [root@iZ28qzns9m4Z bashtest]# test n2.sh \-ef n1.sh && echo true || echo false
    true
    [root@iZ28qzns9m4Z bashtest]#

    テスト式:
    整数テスト:-gt,-lt,-ge,-le,-eq,-ne
    文字列テスト:=,>,<,!=,-z, -n, =~
    注意:
    (1)文字列などはテストを比較します:["$hostname"='localhost']
    (2)パターンマッチングテスト:["STRING"=~PATTERN]]
    組み合わせテスト条件:
    条件間論理演算:
    と:複数の条件を同時に満たす;
    または:複数の条件がその1つを満たすとよい.
    非:指定した条件を逆にします.
    式の組み合わせ:
    と:[[CONDITION 1-a CONDITION 2]]
    または:[[CONDITION 1-o CONDITION 2]]
    非:[!CONDITION]
    コマンドの組み合わせ:
    与:COMMAND 1&&COMMAND 2<--[EXPR 1]&&[EXPR 2]
    または:COMMAND 1‖COMMAND 2
    非:!COMMAND
    ショートオペレータ:&&と
    false && true = false
    false && false = false
    true && false = true
    true && true = true
    if COMMAND1; then
    COMMAND2
    fi
    ショートオペレータ:または
    true || true = true
    true || false = true
    false || true = true
    false || false = false
    if ! COMMAND1; then
    COMMAND2
    fi
    COMMAND1 && COMMAND2 || COMMAND3
    if COMMAND1; then
    COMMAND2
    else
    COMMAND3
    fi