この記事を読めばシェルスクリプトで開発時に必要なif文の基本構文と条件分岐オプションの書き方マスターすることができます。
シェルスクリプトでもif文(条件分岐文)を利用する時には、比較対象が文字列なのか?数値型なのか?を意識する必要があります。
またファイルやディレクトリが存在するか?ファイルの権限はどんな状態か?などシェルスクリプト独特の条件分岐も存在します。
この記事で習得できること
- シェルスクリプトの基本構文
- シェルスクリプトの文字列比較・数値比較のやり方
- オプションを利用した条件分岐
- 上記の条件を論理和・論理積・論理否定で使用する方法
if文の基本構文
まずはif文の基本構文を学びましょう。 シェルスクリプトも通常のプログラミング言語と同様に「if-then」で書きます。
if文
下が最も単純なif文です。「[] : square brackets」の間の条件に半角スペースを忘れないようにしましょう。
if [ <条件> ]; then
処理
fi
if-else文
次がif-else文です。条件以外ならばelse文の処理が実行されます。
if [ <条件> ]; then
ifが正の時の処理
else
ifが負の時の処理
fi
if-elseif-else文
次がif-elseif-else文です。elseif文はシェルスクリプトでは「elif」と書くので注意してください。
if [ <条件> ]; then
ifが正の時の処理
elif
elseifが正の時の処理
else
ifとelseifが負の時の処理
fi
文字列を比較する方法
↓が文字列を比較方法の一覧です。
[table id=27 /]
↓がサンプルスクリプトになります。
# 文字列Aが文字列B等しい
if [ ${STR_A} = ${STR_B} ]; then
# 処理
fi
# 文字列Aと文字列Bが違う
if [ ${STR_A} != ${STR_B} ]; then
# 処理
fi
# 文字列の長さが0以上の時
if [ ${STR} ]; then
# 処理
fi
# 文字列の長さが0以上の時
if [ -n ${STR} ]; then
# 処理
fi
# 文字列の長さが0の時
if [ -z ${STR} ]; then
# 処理
fi
数値を比較する方法
数値を比較の一覧は↓になります。覚え方も載せておきますので暗記しましょう。
[table id=26 /]
↓がサンプルスクリプトになります。
# 数値Aと数値Bが等しい
if [ ${NUM_A} -eq ${NUM_B} ]; then
# 処理
fi
# 数値Aと数値Bが違う
if [ ${NUM_A} -ne ${NUM_B} ]; then
# 処理
fi
# 数値Aが数値Bより小さい
if [ ${NUM_A} -lt ${NUM_B} ]; then
# 処理
fi
# 数値Aが数値B以下
if [ ${NUM_A} -le ${NUM_B} ]; then
# 処理
fi
# 数値Aが数値Bより大きい
if [ ${NUM_A} -gt ${NUM_B} ]; then
# 処理
fi
# 数値Aが数値B以上
if [ ${NUM_A} -ge ${NUM_B} ]; then
# 処理
fi
ファイル・ディレクトリの確認
ファイル・ディレクトリが存在するか?
権限の設定はどうなっているか?
を確認するかは、シェルスクリプトを書く上でマストで覚えるべき条件文になります。
↓がファイル・ディレクトリ確認関連のオプションになります。
[table id=29 /]
※**これらのオプションは「test」コマンドが省略されていることも頭の片隅に入れておいてください。
**↓がサンプルスクリプトです。
# ファイルが存在する時
if [ -e ${FILE} ]; then
# 処理
fi
# ファイルが通常ファイルの時
if [ -f ${FILE} ]; then
# 処理
fi
# ファイルサイズが0以上の時
if [ -f ${FILE} ]; then
# 処理
fi
# シンボリックリンクの時
if [ -L ${SLINK} ]; then
# 処理
fi
# ハードリックリンクの時
if [ -df ${LINK} ]; then
# 処理
fi
# ディレクトリの時
if [ -f ${DIR} ]; then
# 処理
fi
# ファイルが読み取り可能の時
if [ -r ${FILE} ]; then
# 処理
fi
# ファイルが書き込み可能の時
if [ -w ${FILE} ]; then
# 処理
fi
# ファイルが実行可能の時
if [ -x ${FILE} ]; then
# 処理
fi
# ファイルが実行ユーザの所有者の時
if [ -O ${FILE} ]; then
# 処理
fi
# ファイルが実行ユーザのグループの時
if [ -G ${FILE} ]; then
# 処理
fi
# ファイルAがファイルBよりファイル更新が古い時
if [ ${FILE_A} -ot ${FILE_B} ]; then
# 処理
fi
# ファイルAがファイルBよりファイル更新が新しい時
if [ ${FILE_A} -nt ${FILE_B} ]; then
# 処理
fi
複数の条件(OR・AND・NOT)を利用
前述で紹介した条件を、複数の条件で利用する方法を紹介します。
[table id=28 /]
OR条件(論理和)とAND条件(論理積)は2つ利用できますが、
「||」や「&&」を利用するとシェルスクリプトを使ったことがない人にも分かりやすくなります。
また一般的なプログラミング同様に、論理積と論理和が複合される演算では論理和から処理がされる点に注意しましょう。
↓がサンプルスクリプトになります。
# 「数値Aと数値Bが等しい」 または 「数値Cと数値Dが等しい」
if [ ${NUM_A} -eq ${NUM_B} -o ${NUM_C} -eq ${NUM_D} ]; then
# 処理
fi
if [ ${NUM_A} -eq ${NUM_B} || ${NUM_C} -eq ${NUM_D} ]; then
# 処理
fi
# 「数値Aと数値Bが等しい」 かつ 「数値Cと数値Dが等しい」
if [ ${NUM_A} -eq ${NUM_B} -a ${NUM_C} -eq ${NUM_D} ]; then
# 処理
fi
if [ ${NUM_A} -eq ${NUM_B} &&-eq ${NUM_D} ]; then
# 処理
fi
# ファイルが存在しない時
if [ ! -e ${FILE} ]; then
# 処理
fi
おまけ:その他覚えておくこと
その他私が知らなかったものがあったので備忘録のため載せておきます。
※「help test」コマンドで利用できるオプションを確認することができます。
[table id=30 /]