はじめに
この実験では、シェルプログラミングにおける条件文を使って論理的な判断を行う方法を学びます。if-else 文の基本構文と、条件を評価するための数値および文字列比較の使い方についても説明します。この実験が終わると、さまざまな条件に基づいて判断を行うことができるシェルスクリプトを書けるようになります。
この実験では、シェルプログラミングにおける条件文を使って論理的な判断を行う方法を学びます。if-else 文の基本構文と、条件を評価するための数値および文字列比較の使い方についても説明します。この実験が終わると、さまざまな条件に基づいて判断を行うことができるシェルスクリプトを書けるようになります。
変数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
:これは「シャバン」行と呼ばれます。これはシステムに対して、このスクリプトを実行するためのインタプリタを教えます。この場合、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
:未満-eq
:等しい-gt
:超過他にも使える演算子があります。
-le
:未満または等しい-ge
:超過または等しい-ne
:等しくない<
や>
のような記号ではなく、これらの特殊な演算子を使うことに注意してください。これは、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
):文字列が空の場合(長さが 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 se
いくつかの値を変更してみて(たとえば、STRING1
を"hello"以外のものに設定して)、それが出力にどのような影響を与えるかを見てみましょう。
この実験では、シェルプログラミングにおける条件文の使い方を学びました。if-else 文、elif 句、数値比較、文字列比較、論理演算子の使用を練習しました。これらのツールを使うことで、より複雑で判断ベースのシェルスクリプトを作成できるようになります。
要点:
覚えておいてください。シェルスクリプトに精通する鍵は練習です。これらの概念を使った独自のスクリプトを様々な方法で作成してみてください。進歩するにつれて、これらの条件文がより洗練された有用なスクリプトを作成するために欠かせないことがわかるでしょう。