shell scriptのif文まとめ!
こんにちは、@s_tsukaです。
今回はshell scriptのif文のまとめです。この記事を読めば一発で書きたいifを書けるようにすることを目的とします。
経緯
みなさんは普段shell scriptを書いていますか?自分は月に数回程度書いています。便利にするためのscriptだったり、プロダクトコードとしてのscriptだったり、JenkinsのビルドJobやバッチJobのscriptだったり。
そんなとき、高確率でif文を書きますが、いつもifの書き方を忘れてしまいます。C, Java, Scalaなどはちゃんと覚えているのですが、shell scriptはどうしても覚えられなくて・・・そんなわけでまとめていきます。
でもまとめと言えど、すでにまとめてくれているサイトは山ほどあるわけで・・・特にココとかはよくまとまっています。
なので、本当に必要な部分だけまとめていこうと思います。
実際に使う文や機能
以下淡々と載せていきます。シェバン(#!/bin/bashは省略します)
[[
たまに見かける(一部の人はよく使う)bashキーワードである[[です。基本的にはこれを使います。変数展開による事故を防止できるためです。ちなみに[[ですが、日本語名とかわかりませんよね。自分は「かっこかっこ」とか呼んでますが・・・
どうやら英語でも正式名称は無いようですが「double brackets」と呼ばれているようです。
文字列一致
val=foo
if [[ $val = "foo" ]]; then
echo "一致 val=$val"
fi
# 出力
# 一致 val=foo
普通に=使えば良いだけ。
[[を使っておけば変数展開の事故を防げるので、
if [[ $aaa = "foo" ]]; then
echo ""
else
echo "変数が存在しなくても[[組み込みコマンドなら正しく動く aaa=$aaa"
fi
# 出力
# 変数が存在しなくても[[組み込みコマンドなら正しく動く aaa=
こんなのも正しく動きます(変数aaaは定義なし)
数値一致
val=1
if [[ $val = 1 ]]; then
echo "一致 val=$val"
fi
# 出力
# 一致 val=1
こちらも普通に=を使えば良いだけ。
これは一見数値の比較に見えますが、$val = “1”でも一致するので、その点は注意・・・だけど実際書いてるとそれほど型は意識しないので、大丈夫かな?
一致しない(否定)
上記では 「a = b」というように書いていますが、もちろん「a != b」と書けばOKです。
数値の大小比較
# if(val >= 1)
val=1
if [[ $val -ge 1 ]]; then
echo "1以上 val=$val"
fi
# 出力
# 1以上 val=1
ここは少し曲者ですね。-geで「以上」になります。>=は使えません。
geとleで混乱する人は「geは A(左辺)は、B(右辺)より大きいまたはイコール(greater than or equal to)」とストレートに覚えておくと良いと思います。geとgt両方あって分からない・・・という人はe = equalと覚えましょう。
本当は>=というワードが使えれば良いのですけども。
少し飛ばしましたが、
ge : 以上
gt : より大きい
le : 以下
lt : より小さい
ですが、gt, ltについては>, <というおなじみの不等号が使えますので覚えなくても大丈夫です。
ファイルの存在チェック
touch tmp.txt
if [[ -e tmp.txt ]]; then
echo "存在する"
fi
# 出力
# 存在する
existのeで覚えておけば良いと思います。
文字列の長さ(長さ0か1以上か)
val=foo
if [[ -n $val ]]; then
echo "0より長い val=$val"
fi
# 出力
# 0より長い val=foo
val=
if [[ -z $val ]]; then
echo "長さ0 val=$val"
fi
# 出力
# 長さ0 val=
nかzです。これは少々覚えづらいですね。non zero lengthのn、zero lengthのzで覚えると良いかと思います。
ファイルサイズが0より大きいか、あるいは0か
echo "abc" > tmp.txt
if [[ -s tmp.txt ]]; then
echo "中身あり"
fi
# 出力
# 中身あり
rm tmp.txt && touch tmp.txt
if [[ ! -s tmp.txt ]]; then
echo "中身なし"
fi
# 出力
# 中身なし
-sを使えばOKです。sizeのsです。
AND, OR, NOT
if [[ 1 = 1 && 2 = 2 || 3 != 4 ]]; then
echo "複合"
fi
-aや-oは覚える必要はありません。プログラマならばよくある表記通り&&, ||, !で覚えておけば良いです。
細かいオプションを忘れたとき
この記事をあらためて見返しても良いですし、Google検索しても良いですし、man testコマンドを打って説明を読んでも良いと思います。
まとめ
shell scriptのifで重要なポイントだけを説明しました。
みなさんのShell scriptコーディングが少しでも捗れば幸いです。