shellスクリプトプログラミングの条件テストと判断


条件テスト:
ある需要が満たされているかどうかを判断するには、テストメカニズムによって実現する必要がある.
必要なテストを実行するためのテスト式の作成方法:
(1)命令を実行し、命令状態の戻り値で判断する.
     $?:コマンドステータス戻り値
0:成功
1-255:失敗
(2)テスト式
     test  EXPRESSION
     [ EXPRESSION ]
     ` EXPRESSION `
注意:EXPRESSIONの両端に空白文字が必要です.そうしないと文法エラーです.
例:
[root@wlm tmp]# touch a
[root@wlm tmp]# [ -f a ]
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# [ -d a ]
[root@wlm tmp]# echo $?
1
[root@wlm tmp]# test -f a
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# [[ -d $? ]]
[root@wlm tmp]# echo $?
1

bashのテストタイプ:
数値テスト
文字列テスト
ファイルテスト
数値テスト:数値比較
-eq:等しいかどうか;[ $num1 -eq $num2 ]
-ne:等しくないかどうか;
-gt:より大きいかどうか;
-ge:等しいかどうか;
-lt:小さいかどうか;
-le:等しいかどうか;
文字列テスト:
==:等しいかどうか;
>:より大きいかどうか;
    
     !=:等しくないかどうか;
=~:左側の文字列が右側のPATTERNに一致するかどうか;
    
-z「STRING」:指定された文字列が空であるか否かを判定する;空は真で、空でなければ偽である.
-n「STRING」:指定された文字列が空でないか否かを判断する;空でなければ真で、空であれば偽である.
注意:
(1)文字列に参照を付ける.
(2)``;
ファイルテスト:
存在性テスト
     -a  FILE
     -e  FILE
ファイルの存在性テストは、存在すれば真であり、そうでなければ偽である.
存在性およびタイプテスト
-b FILE:存在し、ブロックデバイスファイルであるか.
-c FILE:存在し、文字デバイスファイルであるか.
-d FILE:存在し、ディレクトリファイルであるか.
-f FILE:存在し、通常のファイルであるか.
-h FILEまたは-L FILE:存在し、シンボルリンクファイルであるか.
-p FILE:存在するかどうか、名前付きパイプファイル;
-S FILE:存在するか、ソケットファイルである.
ファイル権限テスト:
-r FILE:存在し、現在のユーザーに対して読み取り可能であるか.
-w FILE:存在し、現在のユーザーに対して書き込み可能であるか.
-x FILE:存在するか、現在のユーザーに対して実行可能か.
特殊な権限テスト:
-u FILE:存在するか、suid権限を持っているか.
-g FILE:sgid権限があるかどうか;
-k FILE:sticky権限があるかどうか;
ファイルに内容があるかどうか:
-s FILE:内容があるかどうか;
タイムスタンプ:
-N FILE:ファイルが前回の読み取り操作から変更されたかどうか;
依存関係テスト:
-O FILE:現在のユーザーがファイルの所有者かどうか;
-G FILE:現在のユーザーがファイルのグループに属しているかどうか;
両目テスト:
FILE 1-ef FILE 2:FILE 1とFILE 2が同じファイルシステムの同じinodeへのハードリンクを指しているかどうか.
FILE 1-nt FILE 2:FILE 1がFILE 2より新しいかどうか;
FILE 1-ot FILE 2:FILE 1がFILE 2より古いかどうか;
組み合わせテスト条件:
論理演算:
1つ目の方法:
COMMAND1 && COMMAND2
COMMAND1 || COMMAND2
! COMMAND 
[ -O FILE ] && [ -r FILE ]
2つ目の方法:
EXPRESSION1  -a  EXPRESSION2
EXPRESSION1  -o  EXPRESSION2
! EXPRESSION
[ -O FILE -a -x FILE ]
練習:現在のホスト名をhostName変数に保存します.ホスト名が空の場合、またはlocalhost.localdomainではwlmに設定します.
[root@wlm tmp]# hostName=$(hostname)
[root@wlm tmp]# hostname
localhost
[root@wlm tmp]# echo $hostName 
localhost
[root@wlm tmp]# [ -z "$hostName" -o "$hostName" == "localhost" -o "$hostName" == "localhost.localdomain" ] && hostname wlm
[root@wlm tmp]# echo $?
0
[root@wlm tmp]# hostname
wlm