Shell における条件分岐

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

はじめに

この実験では、シェルプログラミングで論理的な意思決定を行うための条件分岐(条件文)の使用方法を学びます。if-else 文の基本構文から、数値や文字列の比較による条件評価の方法までをカバーします。この実験を終える頃には、さまざまな条件に基づいて処理を分岐させるシェルスクリプトを作成できるようになります。

初めての 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": 条件が真(true)の場合にこの行が実行されます。
  5. fi: if 文の終わりを示します。"if" を逆さまに綴ったものです。

内容を追加したらファイルを保存してください。

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

chmod +x if.sh

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

それでは、スクリプトを実行してみましょう。

./if.sh

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

次のような出力が表示されるはずです:The name is John

この出力が表示されない場合は、ファイルを正しい内容で保存したか、実行権限を付与したかを再度確認してください。

Else 句を追加する

次に、if 文を拡張して else 句を含めてみましょう。これにより、条件が偽(false)の場合に何が起こるかを指定できます。

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 コマンドを追加しました。

if 文において else 句は任意(オプション)ですが、条件が満たされなかったときに「何もしない」のではなく「特定の処理を行いたい」場合に非常に便利です。

変更を保存してください。

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

./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 つの条件を組み合わせますが、どちらか一方の条件が真であれば、式全体が真になります。
  4. 文字列の不一致比較 (!=): 2 つの文字列が異なるかどうかをチェックします。
  5. 文字列が空かどうかのチェック (-z): 文字列が空(長さが 0)の場合に真になります。

また、一部の 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 set

いくつかの値(例えば STRING1 を "hello" 以外にするなど)を変更してみて、出力にどのように影響するか確認してください。

まとめ

この実験では、シェルプログラミングにおける条件分岐の使用方法を学びました。if-else 文、elif 句、数値比較、文字列比較、および論理演算子の使い方を練習しました。これらのツールを使用することで、より複雑で意思決定に基づいたシェルスクリプトを作成できるようになります。

重要なポイント:

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

シェルスクリプトを習得するには練習が不可欠です。これらの概念をさまざまな方法で組み合わせた独自のスクリプトを作成してみてください。学習が進むにつれて、これらの条件分岐は、より高度で便利なスクリプトを作成するために欠かせないものであることに気づくでしょう。