はじめに
このチュートリアルでは、複数の条件を持つ Bash の if
文の使い方を紹介し、シェルスクリプトのスキルを向上させます。論理演算子を効果的に組み合わせる方法を学び、様々な基準に基づいて賢い判断を行うスクリプトを作成できるようになります。この実験の最後まで学ぶと、日常のタスクを自動化する汎用的なツールを作成できるようになります。
このチュートリアルでは、複数の条件を持つ 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
これで、「The file exists.」と出力されるはずです。この手順では、if
、then
、else
、fi
という基本的な構造を紹介しました。二重の角括弧 [[ ]]
は、現代の Bash の機能で、一重の角括弧よりも条件テストをより信頼性高く行うことができます。
さて、一度に複数の条件をチェックすることで、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)演算子を探索します。この演算子は、少なくとも 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 つの条件が真であれば十分な場合に便利です。
さて、より複雑なロジックのために &&
と ||
を組み合わせましょう。ファイルが存在し、特定の基準を満たしているかどうかをチェックし、フォールバック条件も設定します。
再度 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 システム上で様々なニーズに合わせた信頼性の高い自動化ツールを作成することができます。