Bash If ステートメントの使用方法 (4 つの例を含む)
公開: 2023-05-08if
then
fi
構造で条件式を作成します。 追加の条件式のelif
キーワードを追加するか、 else
キーワードを追加して、前の条件句が実行されなかった場合に実行されるコードのキャッチオール セクションを定義します。重要な Bash スクリプトはすべて決定を下す必要があります。 Bash の if ステートメントを使用すると、Linux スクリプトで質問を行い、その回答に応じてコードのさまざまなセクションを実行できます。 仕組みは次のとおりです。
条件付き実行とは
最も些細な Bash スクリプトを除いて、通常、決定の結果に応じて、実行フローがスクリプト内の別のパスをたどる必要があります。 これを条件付き実行と呼びます。
実行の分岐を決定する 1 つの方法は、 if
ステートメントを使用することです。 if
ステートメントがif then
ステートメントを呼び出したり、 if then else
ステートメントを呼び出したりすることがあります。 それらは同じものの異なる名前です。
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
スクリプトを実行してみましょう。
./if-age.sh
次に、ファイルを編集して、21 歳未満の年齢を使用します。
顧客年齢=18歳
その変更をスクリプトに加え、変更を保存します。 ここで実行すると、条件は false を返し、else 句が実行されます。
./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
それはすべてうまくいっています。
さまざまな形式の条件付きテスト
条件付きテストに使用した括弧 ” []
” は、 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
関連: 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
関連: Linux で二重括弧条件付きテストを使用する方法
もしもの場合
条件付き実行は、プログラミングとスクリプト作成に力をもたらすものであり、控えめなif
ステートメントは、コード内で実行パスを切り替える最も一般的に使用される方法かもしれません。 しかし、それが常に答えであるとは限りません。
優れたコードを書くということは、特定の要件を解決するためにどのオプションがあり、どのオプションを使用するのが最適かを知ることを意味します。 if
ステートメントは優れていますが、バッグの唯一のツールにしないでください。 特に、いくつかのシナリオで解決策になる可能性のあるcase
ステートメントを確認してください。
関連: Bash スクリプトで Case ステートメントを使用する方法