Bourne Again Shell (Bash) スクリプトを作成したことがあれば、スクリプトにロジックを追加するとすぐに複雑になることをご存知でしょう。スクリプトを台無しにしない方法は? Bash if else のような条件付きステートメントは、ロジックを追加する 1 つの方法であり、スクリプトが特定の条件に基づいて決定できるようにします。
このチュートリアルでは、Bash の if-else ステートメントと case ステートメントを使用して、エラーのない Bash スクリプトを作成する方法を学習します。これらすべてに、Bash スクリプトを作成するためのいくつかのベスト プラクティスが含まれています。
準備?読み進めて、Bash スクリプト作成を次のレベルに引き上げましょう!
前提条件
このチュートリアルは実践的なデモンストレーションです。フォローしたい場合は、持っていることを確認してください
- Bash がインストールされた Linux または Windows システム - Windows Subsystem for Linux (WSL) は、Windows ユーザーにとって優れたオプションです。
- コード/テキスト エディター。
条件ステートメントを使用する理由
条件付きステートメントは、特定の条件に基づいてスクリプトで決定を下すことができるため、Bash スクリプトで最も重要なツールの 1 つです。
たとえば、条件ステートメントを使用して、ファイルを削除する前にファイルが存在するかどうかを確認できます。または、ユーザーが特定のリソースへのアクセス許可を持っているかどうかを確認するために使用できます。
条件ステートメントは、スクリプトをより柔軟かつ強力にします。ディレクトリ内のすべてのファイルを削除するスクリプトを作成しているとします。条件ステートメントを使用すると、30 日以上経過したファイルを削除できます。
IFステートメントを理解する
Bash スクリプトの紹介はこれで十分です。最も一般的な条件ステートメントの 1 つである if
を詳しく見てみましょう。
if
ステートメントは、次の構文を使用して Bash スクリプトに条件を追加する最も基本的な方法です:
- if キーワードから始めて、満たす [[条件]] を指定します。その後、if ステートメント内のコードが実行され、ステートメントは fi キーワードで終了します。
- then キーワードは、条件が満たされた場合に実行されるコード (ステートメント) から条件を分離します。行区切りとしてセミコロン (;) を追加すると、このコードは複数行になる場合があります。
if [[ condition ]]; then
statement
fi
ログインする前に、システムの正しいユーザー名を要求するスクリプトを作成しているとします。
1. ターミナルを開き、新しい bash_if_demo.sh を作成します 選択したテキスト エディターを使用してファイルを作成します。
nano bash_if_demo.sh
2. 次のコードをコピーして bash_if_demo.sh に貼り付けます ファイルを開き、変更を保存して、ファイルを閉じます。
以下のコードはユーザー名を要求し、正しいユーザー名が入力されると、コードは現在の日付と時刻とともに「おかえり」メッセージを出力します。
さらに分析するために、ユーザーがシステムにアクセスしようとした日時をログに記録できます。
最初の行 #!/bin/bash (shebang) は、ファイル内の残りのコードを実行するために使用するインタープリターをシステムに指示します。この場合、bash を使用しています。
#!/bin/bash
# Prints a question to the screen.
echo "Whats your name?"
# Reads keyboard input and stores it in the $NAME variable
read NAME
# Starts the if statement - checks to see if the $NAME variable's value
# is equal to ATA. If it is, the code inside runs. Otherwise, the code will not run.
if [ $NAME == "ATA" ]
then
# Prints a message to the screen, only if the value stored in the $NAME variable
# is equal to ATA.
echo "Welcome back ATA!"
fi
# Prints the current date and time to the screen. Since this line is outside
# of the if statement, it always runs regardless of the $NAME variable's value.
date
3. 最後に、以下のコマンドを実行して bash_if_demo.sh スクリプトを実行し、その動作を確認します。
bash bash_if_demo.sh
どの Bash シェルを使用していても、システムが Bash を使用してコードを実行できるように、スクリプト名の前に bash を追加する必要があることに注意してください。
ATA を入力して Enter キーを押すと、次の出力が表示されます。

「ATA.」以外を入力すると、ウェルカム メッセージは表示されず、現在の日付と時刻のみが表示されます。なんで? if ステートメントは、$NAME 変数に格納されている値と正確な値をチェックしているためです。
if ステートメントでは大文字と小文字が区別されることに注意してください。したがって、「ata」、「aTa」、「Ata」などは「ATA」と同じではありません。

さまざまな入力を使用してコードをテストすることは、コードが期待どおりに動作することを確認するためのベスト プラクティスです。
ネストされた If ステートメントについて
if ステートメントの書き方の基本を学んだところで、複雑なコードを書かないのであれば、それで十分です。ただし、そうする場合は、ネストされた if ステートメントを記述して、条件ステートメントを展開してみてください。ネストされた if ステートメントは、1 つ以上の if ステートメントを含む if ステートメントです。
以下は、ネストされた if ステートメントの基本的な構文です。
if [[ conditions ]]
– 外側のif
条件が満たされた場合にのみ実行されるコードを含むステートメント。この場合、別のif
声明)if [[ condition2 ]]
– 内側のif
両方の条件が満たされた場合にのみ実行されるコードを含むステートメント
if [[ conditions
]]; then
if [[ condition2 ]]; then
statement
fi
fi
if
を設定することで、以前のコードをワンランク上に引き上げます パスワードを要求するステートメント:
1. bash_nested_if_demo.sh という名前の新しいファイルを作成します
nano bash_nested_if_demo.sh
2. 以下のコードを bash_nested_if_demo.sh に入力します。 ファイルを開き、変更を保存して、 を閉じます。 ファイル。
以下のコードは、名前とパスワードを要求します。名前とパスワードの両方の条件が満たされた場合、コードはメッセージを出力します。そうでない場合、コードは現在の日付と時刻以外のメッセージを出力しません。
#!/bin/bash
# Prints a message asking for a name.
echo "Whats your name?"
# Reads input from the keyboard.
read NAME
# Check if the $NAME variable's value is equal to "ATA."
if [ $NAME == "ATA" ]
then
# Prints a message asking for a password.
echo "Password"
# Reads input from the keyboard.
read Password
# Nested if statement - Check if the $Password variable's value equals "pwd123."
if [ "$Password" == "pwd123" ]; then
# Prints a message if both conditions for name and password are met.
echo "You logged in as ATA"
fi
fi
# Prints the current date and time
date
3. 最後に、以下のコマンドを実行して bash_nested_if_demo.sh を実行します。
bash bash_nested_if_demo.sh
ATA を入力してください 名前とpwd123

「ATA」または「pwd123」以外を入力した場合、表示される唯一のメッセージは現在の日付と時刻です。なんで?ネストされた if ステートメントの両方の条件を満たす必要があります。

IF ELSE ステートメントについて
if ステートメントは、Bash スクリプトで一般的に使用される強力なツールです。 if ステートメントは、スクリプトで決定を下すのに役立ちます。ただし、if ステートメントの使用にはいくつかの欠点があることに注意してください。
主な欠点は、if ステートメントを使用すると、特に if ステートメントを他の if ステートメント内にネストしている場合に、コードの読み取りと保守が困難になる可能性があることです。このスクリプティング スタイルは、いわゆる「スパゲッティ コード」につながる可能性があります。これは、読みにくく、理解しにくいものです。
では、コードが複雑に見えないようにするにはどうすればよいでしょうか。ネストされた一連の if ステートメントの代わりに、if else ステートメントを使用します。 else キーワードを使用すると、if ステートメントの条件が満たされない場合に実行されるコードを指定できます。
以下の IF ELSE ステートメントの構文を調べてください。
if [[ conditions ]]
–if
コードを含むステートメント (statement1
) 条件が満たされた場合に実行されます。else
–else
ステートメントにはコード (statement2
)if
の条件が満たされた場合に実行されます ステートメントが満たされていません。
if [[ conditions ]]; then
statement1
else
statement2
fi
ユーザーからの入力として乱数を受け取る数字ゲームを作成しているとします。
1. bash_if_else_demo.sh という名前の新しいファイルを作成します。
nano bash_if_else_demo.sh
2. 次のコードを bash_if_else_demo.sh に追加します ファイルを開き、変更を保存して、ファイルを閉じます。
以下のコードは、ユーザーのラッキー ナンバーを尋ねるメッセージを出力し、ユーザーの入力が偶数の場合は、You Won メッセージを出力します。それ以外の場合 (else)、ユーザーの入力が奇数の場合、コードは You Lost メッセージを出力します。
#!/bin/bash
# Prints a message asking for the user's lucky number
echo -n "Enter You Lucky Number:"
# Reads the keyboard input.
read var
# Checks if the value is an even number.
if [ $((var%2)) == 0 ]; then
# Prints a message if the condition is met
echo "You Won!"
else
# Prints a message if the condition is not met
echo "You Lost!"
fi
3. 次に、次のコマンドを実行して bash_if_else_demo.sh スクリプトを実行します。
bash bash_if_else_demo.sh
偶数を入力すると、「You Won!」というメッセージが表示されます。以下に示すように、印刷されます。ただし、奇数を入力すると、「You Lost!」というメッセージが表示されます。

ユーザーが代わりに特殊文字を入力したかどうかを確認する別のステートメントを追加して、コードを改善してみてください。
ケース ステートメントについて
これまで、Bash スクリプトで意思決定を行う 2 つの方法を見てきました:if
ステートメントと else
ステートメント。しかし、スクリプトで決定を下す別の方法があります。それは case
です。
case
ステートメントは if
に似ています 条件に基づいて実行されるコードを指定できるためです。しかし、case ステートメントの良い点は、ネストされた if
よりも正確で簡潔な構文を使用できることです。
case ステートメントの構文は次のとおりです。
case $VAR in
–case
$VAR
を取るステートメント 変数は、一致が見つかるまで、指定したパターンに対してテストします。pattern1)
とpattern2)
- コードを実行する、テストするパターン (statement1
またはstatement2
) パターンが見つかったらesac
– ケース ステートメントを終了します。
case $VAR in
pattern1)
statement1
;;
pattern2)
statement2
;;
esac
ユーザーに国名を入力し、その国で話されている言語を表示するメッセージで応答するよう求めるスクリプトが必要だとします。
1. という新しいファイルを作成します。 bash_case_demo.sh.
nano bash_case_demo.sh
2. 以下のコードを bash_case_demo.sh に入力します。 ファイルを開き、変更を保存してファイルを閉じます。
以下のコードは、ユーザーに国名を尋ね、case ステートメントのパターンに基づいてその国の公用語を出力します。
3#!/bin/bash
# Prints a message asking for the user's country name
echo -n "Enter the Country You Live In:"
# Reads keyboard input.
read var
# Prints a message showing the official language in the user's country ($var)
# based on the pattern in the case statement.
echo -n "The official language of $var is "
# Case statement - checks if the user's input ($var) matches the patterns.
case $var in
# Define patterns that print the user's country's official language.
US)
echo -n "English"
;;
Canada)
echo -n "English | French"
;;
Algeria | Bahrain | Egypt| Jordan)
echo -n "Arabic"
;;
*)
echo -n "unknown"
;;
esac
3. 最後に、次のコマンドを実行して bash_case_demo.sh スクリプトを実行します。
bash bash_case_demo.sh
以下では、ユーザーが入力した国に応じて、適切な公用語が印刷されていることがわかります。
入力した国がどのパターンにも一致しない場合、デフォルトのパターン (*) が使用され、不明なメッセージが出力されます。

結論
このチュートリアルでは、Bash で条件ステートメントを使用する方法を学習するための最初のステップを踏み出しました。 Bash の if ステートメント、if-else ステートメント、case ステートメントを使用して複雑なコードを簡単にする方法を学びました。
これで、条件ステートメントを使用して Bash スクリプトをより効率的に記述し、エラーを減らすことができる自信がつきました。
しかし、ここでやめないでください! Bash の条件ステートメントが提供できるものは他にもあります。おそらく、Bash elif ステートメントと &&、OR、および || について学び始めてください。オペレーター?少し練習すれば、すぐにプロのように Bash スクリプトを記述できるようになります!