複数の条件を持つ Bash の if 文の使い方

ShellShellBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、複数の条件を持つ Bash の if 文の使い方を紹介し、シェルスクリプトのスキルを向上させます。論理演算子を効果的に組み合わせる方法を学び、様々な基準に基づいて賢い判断を行うスクリプトを作成できるようになります。この実験の最後まで学ぶと、日常のタスクを自動化する汎用的なツールを作成できるようになります。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) shell(("Shell")) -.-> shell/AdvancedScriptingConceptsGroup(["Advanced Scripting Concepts"]) shell(("Shell")) -.-> shell/SystemInteractionandConfigurationGroup(["System Interaction and Configuration"]) shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/cond_expr("Conditional Expressions") shell/AdvancedScriptingConceptsGroup -.-> shell/read_input("Reading Input") shell/SystemInteractionandConfigurationGroup -.-> shell/exit_status_checks("Exit Status Checks") subgraph Lab Skills shell/if_else -.-> lab-413763{{"複数の条件を持つ Bash の if 文の使い方"}} shell/cond_expr -.-> lab-413763{{"複数の条件を持つ Bash の if 文の使い方"}} shell/read_input -.-> lab-413763{{"複数の条件を持つ Bash の if 文の使い方"}} shell/exit_status_checks -.-> lab-413763{{"複数の条件を持つ Bash の if 文の使い方"}} end

Bash の if 文の基本を理解する

まずは基礎から始めましょう。Bash では、if 文を使って、条件が真か偽かに基づいてスクリプトが何をするかを決定できます。これは、Ubuntu システム上でタスクを自動化する際に特に便利です。

デフォルトのディレクトリ /home/labex/project でターミナルを開きます。ここですべてのスクリプトを作成します。まずは、次のコマンドを入力して basic_if.sh という名前の簡単なスクリプトファイルを作成しましょう。

touch basic_if.sh

ファイルが存在するかどうかを確認するために、次のコードを追加します。

#!/bin/bash
if [[ -f "testfile.txt" ]]; then
  echo "The file exists."
else
  echo "The file does not exist."
fi

このスクリプトでは、[[ -f "testfile.txt" ]] を使って、現在のディレクトリに testfile.txt が存在するかどうかをテストします。echo コマンドは、結果に応じてメッセージを表示します。

スクリプトを実行するには、実行可能にします。

chmod +x basic_if.sh

次に、スクリプトを実行します。

./basic_if.sh

testfile.txt はまだ存在しないため、「The file does not exist.」と表示されます。別の結果を見るために、ファイルを作成しましょう。

touch testfile.txt

再度スクリプトを実行します。

./basic_if.sh
basic_if.sh

これで、「The file exists.」と出力されるはずです。この手順では、ifthenelsefi という基本的な構造を紹介しました。二重の角括弧 [[ ]] は、現代の Bash の機能で、一重の角括弧よりも条件テストをより信頼性高く行うことができます。

AND (&&) を使った複数条件の追加

さて、一度に複数の条件をチェックすることで、if 文をもっと賢くしましょう。&&(AND)演算子を使用します。この演算子は、then ブロックを実行するためにすべての条件が真である必要があります。

再度 basic_if.sh を開き、その内容を次の更新されたスクリプトに置き換えます。

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]]; then
  echo "The file exists and is readable."
else
  echo "The file is either missing or not readable."
fi

このスクリプトは 2 つのことをチェックします。testfile.txt が存在するかどうか(-f)と、読み取り可能かどうか(-r)です。最初のメッセージが表示されるには、両方の条件が真でなければなりません。

スクリプトを実行します。

./basic_if.sh

ステップ 1 で testfile.txt を作成し、デフォルトで読み取り可能であるため(labex が所有者であるため)、「The file exists and is readable.」と表示されます。&& がどのように機能するかを理解するために、逆のシナリオをテストしましょう。ファイルのパーミッションを変更して、読み取り不可にします。

chmod u-r testfile.txt

再度スクリプトを実行します。

./basic_if.sh

これで、2 番目の条件(-r)が失敗するため、「The file is either missing or not readable」と出力されます。次の手順のために読み取り権限を復元します。

chmod u+r testfile.txt

&& 演算子は、すべての条件が合格することを保証します。複数の基準が重要な状況に最適です。

柔軟な条件のために OR (||) を使用する

次に、||(OR)演算子を探索します。この演算子は、少なくとも 1 つ の条件が真であれば then ブロックを実行します。これは、チェックに柔軟性が必要な場合に便利です。

再度 basic_if.sh を開き、次のコードで更新します。

#!/bin/bash
if [[ -f "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "At least one file exists."
else
  echo "Neither file exists."
fi

このスクリプトは、testfile.txt または backup.txt のいずれかが存在するかどうかをチェックします。testfile.txt はすでにディレクトリに存在するため、スクリプトを実行します。

./basic_if.sh

「At least one file exists.」と表示されます。次に、|| の論理をテストするために testfile.txt を削除します。

rm testfile.txt

再度スクリプトを実行します。

./basic_if.sh

どちらのファイルも存在しないため、「Neither file exists」と出力されます。OR 条件が成立するのを見るために backup.txt を作成します。

touch backup.txt
./basic_if.sh

これで、再び「At least one file exists」と表示されます。|| 演算子は、いずれか 1 つの条件が真であれば十分な場合に便利です。

AND と OR 演算子の組み合わせ

さて、より複雑なロジックのために &&|| を組み合わせましょう。ファイルが存在し、特定の基準を満たしているかどうかをチェックし、フォールバック条件も設定します。

再度 basic_if.sh を開き、次のコードで更新します。

#!/bin/bash
if [[ -f "testfile.txt" ]] && [[ -r "testfile.txt" ]] || [[ -f "backup.txt" ]]; then
  echo "Either testfile.txt is readable or backup.txt exists."
else
  echo "No suitable file found."
fi

このスクリプトは、testfile.txt が存在 し、かつ 読み取り可能であるか、または backup.txt が存在するかをチェックします。testfile.txt を再作成します。

touch testfile.txt

スクリプトを実行します。

./basic_if.sh

testfile.txt が両方の条件を満たしているため、「Either testfile.txt is readable or backup.txt exists」と出力されます。testfile.txt を削除し、backup.txt を残します。

rm testfile.txt
./basic_if.sh

backup.txt|| 条件を満たしているため、同じメッセージが表示されます。backup.txt も削除します。

rm backup.txt
./basic_if.sh

これで、「No suitable file found.」と表示されます。この手順では、微妙な判断を行うために演算子を組み合わせる方法を示しています。

実践的なタスクへの条件の適用

最後に、実世界のシナリオで学んだことを活用しましょう。具体的には、ユーザー入力の検証です。数値が特定の範囲内にあるかどうかをチェックするスクリプトを作成します。

number_check.sh という名前の新しいスクリプトを作成します。

touch number_check.sh
chmod +x number_check.sh

次のコードを追加します。

#!/bin/bash
read -p "Enter a number between 1 and 10: " number
if [[ "$number" -ge 1 ]] && [[ "$number" -le 10 ]]; then
  echo "Valid number: $number"
else
  echo "Invalid number. Please enter a value between 1 and 10."
fi

このスクリプトは、ユーザーに数値の入力を促し、&& を使ってその数値が 1 から 10 の範囲内(両端を含む)にあることを確認します。スクリプトを実行します。

./number_check.sh

5 と入力して Enter キーを押します。「Valid number: 5」と表示されます。再度スクリプトを実行し、15 を入力します。「Invalid number. Please enter a value between 1 and 10.」という応答が返されます。これは、ユーザー入力を扱う実践的な方法であり、スクリプトが有効なデータでのみ処理を進めることを保証します。

まとめ

この実験では、&&|| 演算子を使用して複数の条件を持つ Bash の if 文を習得しました。ファイルのプロパティのチェックからユーザー入力の検証まで、複雑な基準に基づいて判断を行うスクリプトを作成しました。これらのスキルを使えば、Ubuntu システム上で様々なニーズに合わせた信頼性の高い自動化ツールを作成することができます。