if文
書き方
if [ 条件式 ]; then
処理
elif [ 条件式 ]; then
処理
else
処理
fi
具体例
if [ $NUM -eq 0 ]; then # $NUMが0と一致した場合
echo "Succeed"
elif [ $NUM -eq 1 ]; then # $NUMが1と一致した場合
echo "Cleared"
else
echo "Failed"
fi
注意点
-
[
の直後と]
の直前には半角スペースが必要 - testコマンドの略式なので,testコマンドでも同様に書き換え可能
条件式の書き方
文字列の比較
文字列の比較には =
や !=
を使う.
if [ $STR = "sunny" ]; then
echo "Succeed"
elif [ $STR != "rainy" ]; then
echo "Cleared"
else
echo "Failed"
fi
数値の比較
数値の比較には -eq
や -ne
を使う.
Python | シェルスクリプト |
---|---|
== | -eq |
>= | -ge |
> | -gt |
!= | -ne |
if [ $NUM -eq 0 ]; then
echo "NUM == 0"
elif [ $NUM -gt 10 ]; then
echo "NUM > 10"
fi
gt
はgreater thanなので,逆向きの演算子として -lt
や -le
がある.
論理演算(AND/OR/NOT)
論理演算子は以下がサポートされている.
Python | シェルスクリプト |
---|---|
and | && |
or | || |
not | ! |
if [ $NUM -eq 0 ] && [ $STR = "foo" ]; then
echo "NUM == 0 and STR == foo"
elif [ $NUM -gt 10 ] || [ ! $FLAG ]; then
echo "NUM > 10 or not FLAG"
fi
2021-08-16 追記
-a
や-o
は非推奨でした.&&
や||
の利用が推奨されている.
シェルスクリプトの [ -a (AND) と -o (OR) ] は非推奨だかんね - Qiita
変数が定義済みか
文字列(変数 STR
)の長さが0(空)である場合にTRUE → -z
if [ -z "$STR" ]; then
echo "Zero"
fi
文字列(変数 STR
)の長さが0(空)でない場合にTRUE → -n
if [ -n "$STR" ]; then
echo "Nonzero"
fi
正規表現による比較
exprコマンドで正規表現の比較ができる.
ただし,exprコマンドは拡張正規表現が使えない.例えば, (Apple|Orange)
は扱えない.bashやzshは後述の方法を使ったほうがよい.
if expr "123-4567" : "^[0-9]\{3\}-[0-9]\{4\}"; then
echo "True"
else
echo "False"
fi
bashやzshであれば [[ $target =~ REGEX ]]
のように書くことで正規表現で比較できる.
シェルスクリプトでの正規表現を使ったバリデーション - unhurried
ファイル/ディレクトリの存在
ファイルまたはディレクトリ dat
が存在する場合にTRUE → -e
if [ -e "dat" ]; then
echo "Existing"
fi
ファイル 1.txt
が存在する場合にTRUE → -f
if [ -f "1.txt" ]; then
echo "Existing file"
fi
ディレクトリ samples
が存在する場合にTRUE → -d
if [ -d "samples" ]; then
echo "Existing dir"
fi
コマンドの実行結果
コマンドを if
コマンドの後ろに直接記述すればよい.
if mkdir sample; then
echo "Successed"
else
echo "Failed"
fi
$?
を使えば直前のコマンドの実行結果を確認できる.
mkdir sample # 直前のコマンド
if [ $? -eq 0 ]; then
echo "OK"
else
echo "NG"
fi
ワンライナーで書く方法もある.
mkdir sample && echo "OK" || echo "NG"
複数ならべる時はカッコをつければよい.
mkdir sample && (echo "OK1" && echo "OK2") || (echo "NG1" && echo "NG2")
中括弧でも同様にかける.
mkdir sample && {
echo "OK1"
echo "OK2"
} || {
echo "NG1"
echo "NG2"
}