はじめに
この実験(Lab)では、シェルプログラミングで条件文を使用して論理的な判断を行う方法を学びます。if-else 文の基本的な構文と、数値比較や文字列比較を使用して条件を評価する方法について説明します。この実験(Lab)の終わりには、さまざまな条件に基づいて判断を下すことができるシェルスクリプトを作成できるようになります。
この実験(Lab)では、シェルプログラミングで条件文を使用して論理的な判断を行う方法を学びます。if-else 文の基本的な構文と、数値比較や文字列比較を使用して条件を評価する方法について説明します。この実験(Lab)の終わりには、さまざまな条件に基づいて判断を下すことができるシェルスクリプトを作成できるようになります。
NAME
という変数に "John" が格納されているかどうかをチェックする、シンプルな if 文を作成することから始めましょう。
まず、WebIDE でターミナルを開きます。デフォルトでは /home/labex/project
ディレクトリにいるはずです。もし確信が持てない場合は、pwd
コマンドで現在のディレクトリを確認できます。
次のコマンドを使用して、if.sh
という新しいファイルを作成します。
touch if.sh
このコマンドは、現在のディレクトリに if.sh
という名前の空のファイルを作成します。
次に、WebIDE で if.sh
ファイルを開きます。WebIDE の左側にあるファイルエクスプローラーでファイルをクリックすることで開くことができます。
ファイルに次の内容を追加します。
#!/bin/bash
NAME="John"
if [ "$NAME" = "John" ]; then
echo "The name is John"
fi
このスクリプトを分解してみましょう。
#!/bin/bash
: これは「shebang」行と呼ばれます。スクリプトを実行するために使用するインタープリターをシステムに指示します。この場合、Bash を使用しています。NAME="John"
: この行は、NAME
という変数を作成し、それに値 "John" を割り当てます。if [ "$NAME" = "John" ]; then
: これは if 文の始まりです。NAME
の値が "John" と等しいかどうかをチェックします。
[ ]
は、実際には Bash のコマンドであり、test
コマンドと同等です。"$NAME"
を引用符で囲むことで、NAME
が空の場合やスペースを含む場合に対応します。then
は、Bash の if 文の構文の一部です。echo "The name is John"
: この行は、条件が真の場合に実行されます。fi
: これは if 文の終わりを示します。これは「if」を逆にしたものです!この内容を追加したら、ファイルを保存します。
次に、スクリプトを実行可能にする必要があります。Unix 系システムでは、セキュリティ上の理由から、ファイルはデフォルトでは実行可能ではありません。chmod
コマンドを使用してこれを変更できます。
chmod +x if.sh
このコマンドは、ファイルに実行権限を追加します。+x
は「実行権限を追加する」という意味です。
次に、スクリプトを実行します。
./if.sh
./
は、シェルに現在のディレクトリでスクリプトを探すように指示します。
出力として The name is John
が表示されるはずです。
この出力が表示されない場合は、ファイルが正しい内容で保存されていることと、実行可能になっていることを再確認してください。
次に、if 文を拡張して else 句を含めてみましょう。これにより、条件が偽の場合に何が起こるかを指定できます。
WebIDE で if.sh
ファイルをもう一度開き、次のように変更します。
#!/bin/bash
NAME="Alice"
if [ "$NAME" = "John" ]; then
echo "The name is John"
else
echo "The name is not John"
fi
変更点を見ていきましょう。
NAME
変数を "Alice" に変更しました。これは、条件が偽の場合に何が起こるかを示すためです。else
句を追加しました。この句は、if 文の条件が偽の場合に何が起こるかを指定します。else
の後に、NAME
が "John" でない場合に実行される別の echo
コマンドを追加しました。else
句は if 文ではオプションですが、条件が偽の場合に、単に何もしないのではなく、何か特定のことをしたい場合に非常に役立ちます。
これらの変更を加えてファイルを保存します。
次に、スクリプトをもう一度実行します。
./if.sh
今回は、出力として The name is not John
が表示されるはずです。
これは、NAME
が現在 "Alice" であるため、条件 [ "$NAME" = "John" ]
が偽となり、else
ブロック内のコードが実行されるためです。
NAME
変数を "John" に戻して、もう一度スクリプトを実行してみてください。どのような出力が得られますか?これは、if-else 文が両方のケースで正しく機能していることをテストする良い方法です。
場合によっては、複数の条件をチェックしたいことがあります。ここで elif
(else if) 句が役立ちます。複数の名前を処理するようにスクリプトを変更してみましょう。
if.sh
ファイルを次の内容で更新します。
#!/bin/bash
NAME="George"
if [ "$NAME" = "John" ]; then
echo "John Lennon"
elif [ "$NAME" = "Paul" ]; then
echo "Paul McCartney"
elif [ "$NAME" = "George" ]; then
echo "George Harrison"
elif [ "$NAME" = "Ringo" ]; then
echo "Ringo Starr"
else
echo "Unknown member"
fi
このスクリプトを分解してみましょう。
NAME="George"
から始めます。これは、チェックする名前になります。if
文は、名前が "John" であるかどうかをチェックします。elif
(else if) 文に進み、名前が "Paul" であるかどうかをチェックします。elif
に進み、"George" をチェックします。else
句にフォールスルーし、"Unknown member" をエコーします。elif
句を使用すると、複数の条件を順番にチェックできます。必要な数の elif
句を持つことができます。条件は順番にチェックされ、最初に真となる条件の対応するコードブロックが実行されます。
これらの変更を加えてファイルを保存します。
次に、スクリプトを実行します。
./if.sh
出力として George Harrison
が表示されるはずです。
NAME
変数を異なる値 ("John"、"Paul"、"Ringo"、または完全に別のもの) に変更し、毎回スクリプトを実行してみてください。NAME
の値に基づいて出力がどのように変化するかを観察してください。
シェルスクリプトは、数値の比較もできます。数値比較を実演するために、新しいスクリプトを作成しましょう。
numeric.sh
という名前の新しいファイルを作成します。
touch numeric.sh
WebIDE で numeric.sh
を開き、次の内容を追加します。
#!/bin/bash
NUMBER=10
if [ $NUMBER -lt 5 ]; then
echo "The number is less than 5"
elif [ $NUMBER -eq 10 ]; then
echo "The number is exactly 10"
elif [ $NUMBER -gt 15 ]; then
echo "The number is greater than 15"
else
echo "The number is between 5 and 15, but not 10"
fi
このスクリプトは、数値比較演算子を紹介します。
-lt
: less than (より小さい)-eq
: equal to (等しい)-gt
: greater than (より大きい)他にも使用できるものがあります。
-le
: less than or equal to (以下)-ge
: greater than or equal to (以上)-ne
: not equal to (等しくない)<
や >
などの記号ではなく、これらの特別な演算子を使用することに注意してください。これは、Bash では、<
と >
が数値比較ではなく、入出力リダイレクトに使用されるためです。
次に、スクリプトを実行可能にして実行しましょう。
chmod +x numeric.sh
./numeric.sh
出力として The number is exactly 10
が表示されるはずです。
NUMBER
変数を異なる値に変更し、もう一度スクリプトを実行してみてください。設定した値に基づいて出力がどのように変化するかを確認してください。
たとえば、NUMBER
を 20 に変更すると、"The number is greater than 15" が表示されます。7 に変更すると、"The number is between 5 and 15, but not 10" が表示されます。
最後に、文字列比較と論理演算子について見ていきましょう。string_logic.sh
という名前の新しいファイルを作成します。
touch string_logic.sh
WebIDE で string_logic.sh
を開き、次の内容を追加します。
#!/bin/bash
STRING1="hello"
STRING2="world"
NUMBER1=5
NUMBER2=10
if [ "$STRING1" = "hello" ] && [ "$STRING2" = "world" ]; then
echo "Both strings match"
fi
if [ $NUMBER1 -lt 10 ] || [ $NUMBER2 -gt 5 ]; then
echo "At least one of the number conditions is true"
fi
if [[ "$STRING1" != "$STRING2" ]]; then
echo "The strings are different"
fi
if [[ -z "$STRING3" ]]; then
echo "STRING3 is empty or not set"
fi
このスクリプトは、いくつかの新しい概念を示しています。
=
): これは、2 つの文字列が完全に同じであるかどうかをチェックします。&&
): この演算子を使用すると、2 つの条件を組み合わせることができます。全体的な式が真になるには、両方の条件が真である必要があります。||
): この演算子も 2 つの条件を組み合わせますが、全体的な式が真になるには、1 つの条件が真であるだけで十分です。!=
): これは、2 つの文字列が異なるかどうかをチェックします。-z
): これは、文字列が空 (長さがゼロ) の場合に真となります。また、いくつかの if 文で二重の角括弧 [[ ]]
が使用されていることにも注意してください。これらは、単一の角括弧の拡張バージョンであり、可能な場合は Bash スクリプトで推奨されます。より複雑な式を可能にし、単語分割とパス名展開に関して驚くことが少なくなります。
スクリプトを実行可能にして実行します。
chmod +x string_logic.sh
./string_logic.sh
スクリプト内のすべての条件が真であるため、4 つすべての echo 文が出力されるはずです。
Both strings match
At least one of the number conditions is true
The strings are different
STRING3 is empty or not se
いくつかの値を変更 (たとえば、STRING1
を "hello" 以外に設定するなど) して、出力がどのように影響を受けるかを確認してください。
この実験では、シェルプログラミングで条件文を使用する方法を学びました。if-else 文、elif 句、数値比較、文字列比較、および論理演算子の使用を練習しました。これらのツールを使用すると、より複雑で意思決定に基づいたシェルスクリプトを作成できます。
主なポイント:
シェルスクリプティングに習熟するには、練習が重要であることを忘れないでください。これらの概念をさまざまな方法で使用する独自のスクリプトを作成してみてください。進歩するにつれて、これらの条件文が、より洗練された便利なスクリプトを作成するために不可欠であることがわかるでしょう。