LoginSignup
23
16

もうシェルスクリプトでif文の書き方を迷わないための逆引きレシピ

Last updated at Posted at 2021-02-13

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"
}

参考URL

23
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
16