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の整数を遍歴します
fi文はネストすることもできます
if条件;then
if条件;then
コマンド1
…
fi
fi
条件を逆にする
!条件:条件が満たされていない場合は真が満たされている場合は偽
ifネスト文のインスタンス
(1)ユーザuser 1-user 10を追加する.
(2)ユーザが存在しない場合にのみ追加する.
(3)実際に追加したユーザー数を統計する.
ダブルブランチif文
if CONDITION-TRUE;then
ブランチ1
else
ブランチ2
fi
二重ブランチif文のインスタンス;
(1)スクリプトにパラメータを渡します.このパラメータはユーザー名です.
(2)ユーザが存在する場合は、次のタスクを実行する
(a)ユーザのid番号が500未満の場合、管理者またはシステムユーザとして表示される.
(b)そうでなければ、一般ユーザとして表示される.
(3)ユーザが存在しない場合、それを追加する.
マルチブランチif文:
ifCONDITION1-TRUE; then
ブランチ1
elifCONDITION2-TRUE; then
ブランチ2
elif CONDITION3-TRUE; then
ブランチ3
...
else
分岐n
fi
スクリプトにパラメータを渡す
パラメータがquitの場合、スクリプトを終了すると表示されます.
パラメータがyesの場合、続行すると表示されます.
そうでなければ、認識できないと表示されます.
ファイルテスト
-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」と表示される.
コンビネーションテスト条件:ショートオペレータ
与:COMMAND 1&&COMMAND 2
COMMAND 1の脱退状態が偽であれば、COMMAND 2は実行せず、最終結果が得られる.
または:COMMAND 1‖COMMAND 2
COMMAND 1の脱退状態が真であれば、COMMAND 2は実行せず、最終結果が得られる.
非:!COMMAND
ショートオペレータの例:スクリプトを書いて次の機能を実現します.
(1)httpdプロセスまたはnginxプロセスが実行中の場合は「web server started.」
(2)そうでない場合は「no web server.」
条件テストの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