シェルにおける条件文

LinuxLinuxBeginner
オンラインで実践に進む

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

はじめに

この実験(Lab)では、シェルプログラミングで条件文を使用して論理的な判断を行う方法を学びます。if-else 文の基本的な構文と、数値比較や文字列比較を使用して条件を評価する方法について説明します。この実験(Lab)の終わりには、さまざまな条件に基づいて判断を下すことができるシェルスクリプトを作成できるようになります。

これは Guided Lab です。学習と実践を支援するためのステップバイステップの指示を提供します。各ステップを完了し、実践的な経験を積むために、指示に注意深く従ってください。過去のデータによると、この 初級 レベルの実験の完了率は 97%です。学習者から 99% の好評価を得ています。

最初の If 文の作成

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

このスクリプトを分解してみましょう。

  1. #!/bin/bash: これは「shebang」行と呼ばれます。スクリプトを実行するために使用するインタープリターをシステムに指示します。この場合、Bash を使用しています。
  2. NAME="John": この行は、NAME という変数を作成し、それに値 "John" を割り当てます。
  3. if [ "$NAME" = "John" ]; then: これは if 文の始まりです。NAME の値が "John" と等しいかどうかをチェックします。
    • 角括弧 [ ] は、実際には Bash のコマンドであり、test コマンドと同等です。
    • "$NAME" を引用符で囲むことで、NAME が空の場合やスペースを含む場合に対応します。
    • セミコロンと then は、Bash の if 文の構文の一部です。
  4. echo "The name is John": この行は、条件が真の場合に実行されます。
  5. fi: これは if 文の終わりを示します。これは「if」を逆にしたものです!

この内容を追加したら、ファイルを保存します。

次に、スクリプトを実行可能にする必要があります。Unix 系システムでは、セキュリティ上の理由から、ファイルはデフォルトでは実行可能ではありません。chmod コマンドを使用してこれを変更できます。

chmod +x if.sh

このコマンドは、ファイルに実行権限を追加します。+x は「実行権限を追加する」という意味です。

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

./if.sh

./ は、シェルに現在のディレクトリでスクリプトを探すように指示します。

出力として The name is John が表示されるはずです。

この出力が表示されない場合は、ファイルが正しい内容で保存されていることと、実行可能になっていることを再確認してください。

Else 句の追加

次に、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

変更点を見ていきましょう。

  1. NAME 変数を "Alice" に変更しました。これは、条件が偽の場合に何が起こるかを示すためです。
  2. else 句を追加しました。この句は、if 文の条件が偽の場合に何が起こるかを指定します。
  3. else の後に、NAME が "John" でない場合に実行される別の echo コマンドを追加しました。

else 句は if 文ではオプションですが、条件が偽の場合に、単に何もしないのではなく、何か特定のことをしたい場合に非常に役立ちます。

これらの変更を加えてファイルを保存します。

次に、スクリプトをもう一度実行します。

./if.sh

今回は、出力として The name is not John が表示されるはずです。

これは、NAME が現在 "Alice" であるため、条件 [ "$NAME" = "John" ] が偽となり、else ブロック内のコードが実行されるためです。

NAME 変数を "John" に戻して、もう一度スクリプトを実行してみてください。どのような出力が得られますか?これは、if-else 文が両方のケースで正しく機能していることをテストする良い方法です。

Elif の紹介

場合によっては、複数の条件をチェックしたいことがあります。ここで 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

このスクリプトを分解してみましょう。

  1. NAME="George" から始めます。これは、チェックする名前になります。
  2. 最初の if 文は、名前が "John" であるかどうかをチェックします。
  3. "John" でない場合は、最初の elif (else if) 文に進み、名前が "Paul" であるかどうかをチェックします。
  4. "Paul" でない場合は、次の elif に進み、"George" をチェックします。
  5. "George" でない場合は、"Ringo" をチェックします。
  6. これらの条件のいずれも真でない場合は、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

このスクリプトは、いくつかの新しい概念を示しています。

  1. 文字列の等価比較 (=): これは、2 つの文字列が完全に同じであるかどうかをチェックします。
  2. 論理 AND (&&): この演算子を使用すると、2 つの条件を組み合わせることができます。全体的な式が真になるには、両方の条件が真である必要があります。
  3. 論理 OR (||): この演算子も 2 つの条件を組み合わせますが、全体的な式が真になるには、1 つの条件が真であるだけで十分です。
  4. 文字列の不等価比較 (!=): これは、2 つの文字列が異なるかどうかをチェックします。
  5. 文字列が空かどうかをチェックする (-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 句、数値比較、文字列比較、および論理演算子の使用を練習しました。これらのツールを使用すると、より複雑で意思決定に基づいたシェルスクリプトを作成できます。

主なポイント:

  • シェルスクリプトにおける if-else 文の基本的な構造
  • 複数の条件に elif を使用する方法
  • 数値比較演算子 (-lt, -gt, -eq など)
  • 文字列比較と論理演算子
  • chmod を使用してスクリプトを実行可能にすることの重要性

シェルスクリプティングに習熟するには、練習が重要であることを忘れないでください。これらの概念をさまざまな方法で使用する独自のスクリプトを作成してみてください。進歩するにつれて、これらの条件文が、より洗練された便利なスクリプトを作成するために不可欠であることがわかるでしょう。