シェルスクリプトのif文の推奨の書き方

2023/01/15に公開

シェルスクリプトのif文の書き方は3通りある。

if test 条件式; then
    処理内容
if [ 条件式 ]; then
    処理内容
if [[ 条件式 ]]; then
    処理内容

3番目の書き方が正規表現処理などに対応しているため推奨されているらしい。
Google Style Guidesが推奨している書き方。

数値比較の場合は(( 条件式 )) にすると、-ge 表記じゃなくて、< > などの不等号が使えるし、計算式も使える。
[[ 条件式 ]] で不等号を使用して数値を比較すると、数値ではなくて文字列として比較してしまう。

#!/bin/bash

var=100

if [[ "${var}" > 90 ]]; then
   echo "varは90以上です。"
elif [[ "${var}" -gt 30 ]]; then
   echo "varは30~89です"
else
   echo "varは30未満です。"
fi

これを実行すると、varは90以上なのにvarは30~89ですと表示されてしまう。

文字列の"100"は "1" のASCII値が最初に比較され、 "0" のASCII値が次に比較され、最後に "0" のASCII値が比較されます。
そして、文字列の "80"は "8" のASCII値が最初に比較され、 "0" のASCII値が次に比較されます。

その結果、 "1" のASCII値が "8" のASCII値より小さいため、"100"は "80"より小さいと判断される。

そもそもvarの中の100が文字列として扱われてるので、文字列90との比較で、90より大きいという条件を満たさない。
elif以降の処理は数値としての比較をしているので、条件を満たしvarは30~89ですと表示する。

参考
【3週間で学ぶ】Amazon Linux Bash シェルスクリプト実践講座!!初心者でも1からマスターする
https://www.udemy.com/course/30awslinux/

Google Style Guides
https://google.github.io/styleguide/

Discussion