Bash の If 文の使用方法 (4 つの例付き)

Linux Bash の if 文を使用して、<code>if</code>thenfi 構造で条件式を構築します。追加の条件式にはelifキーワードを追加するか、elseキーワードを使用して、前の条件句が実行されなかった場合に実行されるコードのキャッチオール セクションを定義します。

すべての複雑な Bash スクリプトでは、決定を行う必要があります。Bash の if 文を使用すると、Linux スクリプトで質問を行い、その回答に応じて異なるコード セクションを実行できます。以下はその仕組みです。

条件付き実行とは

最も単純な Bash スクリプトを除くすべてで、通常は決定の結果に応じて、スクリプトの実行フローがスクリプト内を別のパスに進む必要があります。これは条件付き実行と呼ばれます。

実行する分岐を決定する方法の 1 つは、<code>if</code>文を使用することです。

<code>if</code>

文は、

<code>if then</code>

文または

<code>if then else</code>

文と呼ばれることがあります。これらは同じものの異なる名前です。

<code>if</code>文は、何かが true であれば、これを実行します。ただし、何かが false である場合は、代わりにそれを行います。「何か」には、変数の値、ファイルの存在、2 つの文字列の一致など、さまざまなものがあります。

条件付き実行は、意味のあるスクリプトには不可欠です。それがないと、スクリプトで実行できることが非常に限られます。意味のある決定を下せる場合を除き、現実世界の問題に対処して実行可能なソリューションを生成することはできません。

<code>if</code>文はおそらく、条件付き実行を取得するために最も頻繁に使用される手段です。Bash スクリプティングで使用する方法を以下に示します。

単純な If 文の例

これは、最も単純な<code>if</code>文の標準形式です。

if [ this-condition-is-true ]
then
execute-these-statements
fi

テキスト内の条件が true に解決された場合、then句のスクリプト行が実行されます。他のユーザーが記述したスクリプトを調べている場合は、<code>if</code>文が次のように記述されている場合があります。

if [ this-condition-is-true ]; then
execute-these-statements
fi

注意すべき点がいくつかあります。

  • <code>if</code>文はfiと記述することで終了します。
  • 条件テストの最初の角括弧 "[" の後と 2 番目の角括弧 "]" の前にはスペースが必要です。
  • thenキーワードを条件テストと同じ行に配置する場合は、テストの後にセミコロン ";" を使用してください。

条件テストが false であることが判明した場合にコードを実行するために、オプションのelse句を追加できます。else句にはthenキーワードは必要ありません。

if [ this-condition-is-true ]
then
execute-these-statements
else
execute-these-statements-instead
fi

このスクリプトは、else 句を使用する<code>if</code>文の簡単な例を示しています。条件テストは、顧客の年齢が 21 歳以上であるかどうかを確認します。その場合、顧客は施設に入場でき、then句が実行されます。年齢が十分でない場合、else句が実行され、入場が許可されません。

#!/bin/bash
customer_age=25
if [ $customer_age -ge 21 ]
then
echo "Come on in."
else
echo "You can't come in."
fi

上のスクリプトをエディタにコピーし、「if-age.sh」という名前のファイルとして保存し、chmodコマンドを使用して実行可能にします。説明するスクリプトごとにこれを行う必要があります。

chmod +x if-age.sh

スクリプトを実行してみましょう。

./if-age.sh

次に、ファイルを編集して、21 未満の年齢を使用します。

customer_age=18

スクリプトをそのように変更し、変更を保存します。今すぐ実行すると、条件は false を返し、else 句が実行されます。

./if-age.sh

elif 句

elif句は、追加の条件テストを追加します。elif句は好きなだけ使用できます。それらは、1 つが見つかるまで順番に評価されます。elif条件テストのいずれも true でない場合、存在する場合、else句が実行されます。

このスクリプトは数字を尋ね、奇数か偶数かを教えてくれます。ゼロは偶数なので、何もテストする必要はありません。

他のすべての数字は、2 で割った剰余を見つけることによってテストされます。この場合、剰余は 2 で割った結果の小数部分です。小数部分がない場合、数字は 2 で正確に割り切れます。したがって、それは偶数です。

#!/bin/bash
echo -n "Enter a number: "
read number
if [ $number -eq 0 ]
then
echo "You entered zero. Zero is an even number."
elif [ $(($number % 2)) -eq 0 ]
then
echo "You entered $number. It is an even number."
else
echo "You entered $number. It is an odd number."
fi

このスクリプトを実行するには、エディタにコピーして「if-even.sh」という名前で保存してから、chmod を使用して実行可能にします。

スクリプトを数回実行して出力を確認してみましょう。

./if-even.sh

すべて正常に動作しています。

条件テストのさまざまな形式

条件テストに使用した角括弧「[]」は、testプログラムを呼び出すための省略形です。そのため、testがサポートするすべての比較とテストを<code>if</code>文で使用できます。

以下はそのほんの一部です。

  • ! expression: 式が false の場合に true。
  • -n string: 文字列の長さがゼロより大きい場合に true。
  • -z string: 文字列の長さがゼロの場合に true。つまり、空の文字列です。
  • string1 = string2: string1 が string2 と同じ場合に true。
  • string1 != string2: string1 が string2 と異なる場合に true。
  • integer1 -eq integer2: integer1 が数値的に integer2 と等しい場合に true
  • integer1 -qt integer2: integer1 が数値的に integer2 より大きい場合に true
  • integer1 -lt integer2: integer1 が数値的に integer2 より小さい場合に true
  • -d directory: ディレクトリが存在する場合に true。
  • -e file: ファイルが存在する場合に true。
  • -s file: ファイルが存在し、サイズがゼロより大きい場合に true。
  • -r file: ファイルが存在し、読み取り権限が設定されている場合に true。
  • -w file: ファイルが存在し、書き込み権限が設定されている場合に true。
  • -x file: ファイルが存在し、実行権限が設定されている場合に true。

表の中で、「file」と「directory」には、相対パスまたは絶対パスのディレクトリを含めることができます。

等号「=」と等価テスト-eqは同じではありません。等号は、文字ごとにテキストを比較します。等価テストは、数値を比較します。

コマンドラインでtestプログラムを使用すると、これがわかります。

test "this string" = "this string"

test "this string" = "that string"

test 1 = 001

test 1 -eq 001

各ケースで、echoコマンドを使用して、最後のコマンドの戻りコードを出力します。ゼロは true を意味し、1 は false を意味します。

等号「=」を使用すると、1 と 001 を比較したときに誤った応答が返されます。これは、これらが 2 つの異なる文字列であるため、正しいです。数値的には同じ値 (1) なので、-eq演算子は true の応答を返します。

条件テストでワイルドカード マッチングを使用する場合は、二重角括弧「[[ ]]」構文を使用します。

#!/bin/bash
if [[ $USER == *ve ]]
then
  echo "Hello $USER"
else
  echo "$USER does not end in 've'"
fi

このスクリプトは、現在のユーザーのアカウント名を確認します。「ve」で終わっている場合は、ユーザー名を出力します。「ve」で終わっていない場合、スクリプトはそれを通知し、終了します。

./if-wild.sh

ネストされた if 文

<code>if</code>文を別の<code>if</code>文の中に配置できます。

これは完全に許容されますが、<code>if</code>文をネストすると、コードが読みづらくなり、メンテナンスが困難になります。<code>if</code>文を 2 つまたは 3 つ以上ネストしていることに気付いた場合は、おそらくスクリプトのロジックを再編成する必要があります。

1 から 7 までの数字として日を取得するスクリプトを以下に示します。1 は月曜日、7 は日曜日です。

ショップの営業時間をお知らせします。平日または土曜日の場合、ショップが営業中であることを報告します。日曜日であれば、ショップが閉まっていることを報告します。

ショップが開いている場合、ネストされた<code>if</code>文は 2 番目のテストを行います。その日が水曜日であれば、午前中のみ営業していることをお知らせします。

#!/bin/bash
# 1..7 の数字として日を取得する
day=$(date +"%u")
if [ $day -le 6 ]
then
## ショップは営業中
if [ $day -eq 3 ]
then
# 水曜日は半日
echo "On Wednesdays we open in the morning only."
else
# 通常の平日と土曜日
echo "We're open all day."
fi
else
# 日曜日は営業していません
echo "It's Sunday, we're closed."
fi

このスクリプトをエディタにコピーして、「if-shop.sh」という名前のファイルとして保存し、chmodコマンドを使用して実行可能にします。

スクリプトを 1 回実行してからコンピュータの時計を水曜日に変更し、スクリプトを再実行しました。その後、曜日を日曜日に変更してもう一度実行しました。

./if-shop.sh

./if-shop.sh

./if-shop.sh

if の場合

条件付き実行は、プログラミングとスクリプティングに力を与えるものであり、控えめな<code>if</code>文は、コード内の実行パスを切り替える最も一般的に使用される方法です。しかし、それが常に答えであるという意味ではありません。

優れたコードを書くということは、どのような選択肢があるかを知り、特定の要件を解決するために最適なものを選択することを意味します。<code>if</code>文は優れていますが、それが唯一のツールにならないようにしてください。特に、一部のシナリオで解決策となる可能性のあるcase文をチェックしてください。