Bash If ステートメントの使用方法 (4 つの例を含む)

公開: 2023-05-08
背景に地球のパターンとバイナリの透かしが表示されたターミナル ウィンドウを表示している Linux ラップトップ
Fatmawati achmad zaenuri/Shutterstock
Linux Bash の if ステートメントを使用して、 if then fi構造で条件式を作成します。 追加の条件式のelifキーワードを追加するか、 elseキーワードを追加して、前の条件句が実行されなかった場合に実行されるコードのキャッチオール セクションを定義します。

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

条件付き実行とは

最も些細な Bash スクリプトを除いて、通常、決定の結果に応じて、実行フローがスクリプト内の別のパスをたどる必要があります。 これを条件付き実行と呼びます。

実行の分岐を決定する 1 つの方法は、 ifステートメントを使用することです。 ifステートメントがif thenステートメントを呼び出したり、 if then elseステートメントを呼び出したりすることがあります。 それらは同じものの異なる名前です。

Linux Bash スクリプトの for ループの 9 つの例
関連9 Linux Bash スクリプトの for ループの例

ifステートメントは、何かが true の場合、これを行うことを示しています。 ただし、何かが間違っている場合は、代わりにそうしてください。 「何か」には、変数の値、ファイルの存在、または 2 つの文字列が一致するかどうかなど、さまざまなものがあります。

条件付き実行は、意味のあるスクリプトにとって不可欠です。 これがないと、スクリプトで実行できることが非常に制限されます。 意味のある決定を下すことができない限り、現実世界の問題を取り上げて実行可能な解決策を生み出すことはできません。

ifステートメントは、条件付き実行を取得するためにおそらく最も頻繁に使用される手段です。 これを Bash スクリプトで使用する方法を次に示します。

関連: Linux Bash スクリプトにファイルが存在するかどうかを確認する方法

簡単な If ステートメントの例

これは、最も単純なifステートメントの標準的な形式です。

 [この条件が真] の場合
それから
  これらのステートメントを実行する
フィ

テキスト内の条件が true に解決された場合、 then句のスクリプト行が実行されます。 他の人が書いたスクリプトを調べていると、 ifステートメントが次のように書かれているのを目にするかもしれません。

 [この条件が真] の場合。 それから
  これらのステートメントを実行する
フィ

注意すべき点:

  • ifステートメントは、 fiを書くことによって終了します。
  • 条件テストの最初のブラケット「 [ 」の後と 2 番目のブラケット「 ]の前スペースが必要です。
  • thenキーワードを条件テストと同じ行に入れる場合は、必ずセミコロン ” を使用してください; 」 テスト後。

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

 [この条件が真] の場合
それから
  これらのステートメントを実行する
それ以外
  代わりにこれらのステートメントを実行する
フィ

このスクリプトは、 else句を使用するifステートメントの簡単な例を示しています。 条件付きテストでは、顧客の年齢が 21 歳以上かどうかがチェックされます。年齢が 21 歳以上の場合、顧客は敷地内に入ることができ、 then句が実行されます。 それらが十分に古くない場合、 else句が実行され、許可されません。

 #!/ビン/バッシュ

顧客年齢=25

[ $customer_age -ge 21 ] の場合
それから
  echo "お入りください。"
それ以外
  echo "入れません。"
フィ

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

 chmod +x if-age.sh 

chmod を使用してスクリプトを実行可能にする

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

 ./if-age.sh 

age 変数を 25 に設定して if-age.sh スクリプトを実行する

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

 顧客年齢=18歳

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

 ./if-age.sh 

age 変数を 18 に設定して if-age.sh スクリプトを実行する

elif 節

elif句は、追加の条件テストを追加します。 elif句はいくつでも使用できます。 それらのいずれかが真であることが判明するまで、それらは順番に評価されます。 elif条件テストのいずれも真であることが証明されない場合、 else節が存在する場合はそれが実行されます。

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

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

 #!/ビン/バッシュ

echo -n "数字を入力してください: "

番号を読む

[ $number -eq 0 ] の場合
それから
  echo "ゼロを入力しました。ゼロは偶数です。"
elif [ $(($number % 2)) -eq 0 ]
それから
  echo "$number を入力しました。偶数です。"
それ以外
  echo "$number を入力しました。奇数です。"
フィ

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

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

 ./if-偶数.sh 

さまざまな入力を使用して if-even.sh スクリプトを実行する

それはすべてうまくいっています。

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

条件付きテストに使用した括弧 ” [] ” は、 testプログラムを呼び出す簡単な方法です。 そのため、 testがサポートするすべての比較とテストは、 ifステートメントで使用できます。

これはそれらのほんの一部です:

  • ! : 式が false の場合は true。
  • -n string : 文字列の長さが 0 より大きい場合は 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 : ファイルが 0 より大きいサイズで存在する場合は true。
  • -r file : ファイルが存在し、読み取り許可が設定されている場合は true。
  • -w file : ファイルが存在し、書き込み許可が設定されている場合は true。
  • -x file : ファイルが存在し、実行権限が設定されている場合は true。

表の「ファイル」と「ディレクトリ」には、相対パスまたは絶対パスのいずれかのディレクトリ パスを含めることができます。

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

これは、コマンド ラインでtestプログラムを使用して確認できます。

 test "この文字列" = "この文字列"
 test "この文字列" = "その文字列"
 テスト 1 = 001
 テスト 1 -eq 001

いずれの場合も、 echoコマンドを使用して、最後のコマンドのリターン コードを出力します。 ゼロは真を意味し、1 は偽を意味します。

コマンド ラインでテスト プログラムを使用してさまざまな比較をテストする

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

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

 #!/ビン/バッシュ

[[ $USER == *ve ]] の場合
それから
  echo "こんにちは $USER"
それ以外
  echo "$USER は 've' で終わっていません"
フィ

このスクリプトは、現在のユーザーのアカウント名をチェックします。 「 ve 」で終わる場合、ユーザー名が出力されます。 ” ve ” で終わらない場合、スクリプトはそう伝えて終了します。

 ./if-wild.sh 

if ステートメントの条件テストでのワイルドカード検索を示す if-wild.sh スクリプトの実行

関連: Bash での条件付きテスト: if、then、else、elif

ネストされた If ステートメント

ifステートメントを別のifステートメントの中に入れることができます。

これはまったく問題ありませんが、 ifステートメントをネストすると、コードが読みにくくなり、保守が難しくなります。 2 つまたは 3 つ以上のレベルのifステートメントをネストしていることに気付いた場合は、おそらくスクリプトのロジックを再編成する必要があります。

これは、1 から 7 までの数字で日を取得するスクリプトです。 1 つは月曜日、7 は日曜日です。

お店の営業時間を教えてくれます。 平日または土曜日の場合は、ショップが開いていることを報告します。 日曜日の場合は、店が閉まっていることを報告します。

店が開いている場合は、ネストされたifステートメントが 2 番目のテストを行います。 その日が水曜日の場合、午前中のみ営業していることがわかります。

 #!/ビン/バッシュ

# 日を数値 1..7 で取得
day=$(日付 +"%u")

[ $day -le 6 ] の場合
それから
  ## お店は開いています
  [ $day -eq 3 ] の場合
  それから
    # 水曜日は半日
    echo "水曜日は午前中のみ営業しています。"
  それ以外
    # 通常の平日と土曜日
   echo "終日営業しています。"
  フィ
それ以外
  #日曜休み
  echo "今日は日曜日です。お休みです。"
フィ

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

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

 ./if-shop.sh
 ./if-shop.sh
 ./if-shop.sh 

コンピューターの時計を平日、水曜日、日曜日に設定して if-shop.sh スクリプトを実行する

関連: Linux で二重括弧条件付きテストを使用する方法

もしもの場合

条件付き実行は、プログラミングとスクリプト作成に力をもたらすものであり、控えめなifステートメントは、コード内で実行パスを切り替える最も一般的に使用される方法かもしれません。 しかし、それが常に答えであるとは限りません。

優れたコードを書くということは、特定の要件を解決するためにどのオプションがあり、どのオプションを使用するのが最適かを知ることを意味します。 ifステートメントは優れていますが、バッグの唯一のツールにしないでください。 特に、いくつかのシナリオで解決策になる可能性のあるcaseステートメントを確認してください。

関連: Bash スクリプトで Case ステートメントを使用する方法