Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

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 -a
or -o
not !
if [ $NUM -eq 0 -a $STR = "foo" ]; then
  echo "NUM == 0 and STR == foo"
elif [ $NUM -gt 10 -o ! $FLAG ]; then
  echo "NUM > 10 or not FLAG"
fi

変数が定義済みか

文字列(変数 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

コマンドの実行結果

$?を使えば直前のコマンドの実行結果を確認できる.

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

cdsl
東京工科大学コンピュータサイエンス学部クラウド・分散システム研究室
https://www.tak-cslab.org/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away