bashプログラミングif文条件テスト


bashスクリプトの条件テスト
条件テストの4つの方法:
        testEXPRESSION
        [EXPRESSION ]
[[EXPRESSION]:中括弧と中括弧の大部分は共通ですが、いくつかの演算子と衝突する場合がありますので、注意してください.
COMMAND:ここでテストしたのは、コマンド実行の状態戻り値、すなわち、コマンド実行が成功したかどうか、成功した場合は戻り値が0、そうでない場合は1-255の任意の数字である
テスト式:
整数テスト:A,B
A-gt B:より大きい
A-ge B:以上
A-eq B:等しい
A-lt B:より小さい
A-le B:以下
A-ne B:等しくない
文字列テスト:A,B
            A> B
            A< B
            A>= B
            A<= B
A==BまたはA=B:等値比較
            A!= B:等しくない
-zA:Aが空かどうかを判断する;空は真で、空でなければ偽である.
-nA:Aが空でないか判断する;空でなければ値、空であれば偽.
条件テストのif文
単一ブランチif文
if条件;then
コマンド1
コマンド2
            …
        fi
if文単一分岐インスタンス
100以内のすべての偶数の和、すべての1-100の整数を遍歴します
#!/bin/bash
declare -i sum=0
for i in{1..100};do
       if [ $[$i%2] -eq 0 ] ;then
                sum=$[$sum+$i]
            fi
done
echo"$sum"

fi文はネストすることもできます
if条件;then
if条件;then
コマンド1
         …
     fi
fi
条件を逆にする
    !条件:条件が満たされていない場合は真が満たされている場合は偽
ifネスト文のインスタンス
(1)ユーザuser 1-user 10を追加する.
(2)ユーザが存在しない場合にのみ追加する.
(3)実際に追加したユーザー数を統計する.
#!/bin/bash
declare -i users=0
for i in {1..10};do
if ! id user$i; then
useradd user$i
users=$[$users+1]
fi
done
echo "$users."

ダブルブランチif文
if CONDITION-TRUE;then
ブランチ1
else
ブランチ2
fi
二重ブランチif文のインスタンス;
(1)スクリプトにパラメータを渡します.このパラメータはユーザー名です.
(2)ユーザが存在する場合は、次のタスクを実行する
(a)ユーザのid番号が500未満の場合、管理者またはシステムユーザとして表示される.
(b)そうでなければ、一般ユーザとして表示される.
(3)ユーザが存在しない場合、それを追加する.
#!/bin/bash
if id $1; then
    userid=`id -u $1`
    if [ $userid -lt 500 ]; then
        echo "$1 is sysadmin orsysuser."
    else
        echo "A common user."
    fi
else
    useradd $1
    if [ $? -eq 0];then
        echo "Add user $1 successfully."
    else
        echo "Cannot add $1."
    fi
fi

マルチブランチif文:
ifCONDITION1-TRUE; then
ブランチ1
elifCONDITION2-TRUE; then
ブランチ2
elif CONDITION3-TRUE; then
ブランチ3
...
else
分岐n
fi
   
スクリプトにパラメータを渡す
パラメータがquitの場合、スクリプトを終了すると表示されます.
パラメータがyesの場合、続行すると表示されます.
そうでなければ、認識できないと表示されます.
#!/bin/bash
if $1=quit;then
    echo "quit"
elif $1=yes ;then
    echo "yes"
else
    echo "no"
fi

ファイルテスト
-e$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:現在のユーザーがファイルのグループに属しているかどうか.
-N$file:ファイルが前回読み込まれてから、修正されたかどうか.
$f 1-nt$f 2:ファイルf 1がファイルf 2より新しいかどうか;
$f 1-ot$f 2:ファイルf 1がファイルf 2より古いかどうか;
$f 1-ef$f 2:f 1とf 2が同じファイルのハードリンクであるかどうか.
ファイルテストの例
スクリプトを書き、ファイルパスパラメータをスクリプトに渡します.
(1)スクリプトにパラメータがない場合は、少なくとも1つのパラメータを与え、スクリプトを終了する必要があることを示します.終了コード5;
(2)パス指向のファイルが存在しない場合は、スクリプトを直接終了する.終了コードは6です.
(3)判断書類の種類:
(a)通常ファイルの場合は「common file」と表示されます.
(b)ディレクトリであれば「directory」と表示される.
(c)シンボルリンクの場合は「symbolic link file」と表示される.
(d)ブロックデバイスであれば「ブロックデバイスfile」と表示される.
(e)文字デバイスの場合は「character device file」と表示されます.
(f)そうでなければ、「unkown」と表示される.
       
#!/bin/bash
        if[ $# -lt 1 ]; then
            echo "At least one argument."
            exit 5
        fi
        if[ ! -e $1 ]; then
            echo "No such file."
            exit 6
        fi
        if[ -f $1 ]; then
            echo "common file."
        elif[ -d $1 ]; then
            echo "directory."
        elif[ -L $1 ]; then
            echo "Symbolic link."
        elif[ -b $1 ]; then
            echo "block device."
        elif[ -c $1 ]; then
            echo "character device."
        else
            echo "unkown type."
        fi

コンビネーションテスト条件:ショートオペレータ
与:COMMAND 1&&COMMAND 2
COMMAND 1の脱退状態が偽であれば、COMMAND 2は実行せず、最終結果が得られる.
または:COMMAND 1‖COMMAND 2
COMMAND 1の脱退状態が真であれば、COMMAND 2は実行せず、最終結果が得られる.
非:!COMMAND
       
 [! -d /tmp/test ] && mkdir /tmp/test
 [ -d /tmp/test ] || mkdir /tmp/test

ショートオペレータの例:スクリプトを書いて次の機能を実現します.
(1)httpdプロセスまたはnginxプロセスが実行中の場合は「web server started.」
(2)そうでない場合は「no web server.」
           
 #!/bin/bash
if pidof httpd && pidof nginx ;then
     echo“web server started”
else
     echo“no web server”
fi