シェルにおける条件文

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

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

はじめに

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

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

Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/FileandDirectoryManagementGroup(["File and Directory Management"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") linux/BasicSystemCommandsGroup -.-> linux/logical("Logic Operations") shell/VariableHandlingGroup -.-> shell/variables_decl("Variable Declaration") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") linux/FileandDirectoryManagementGroup -.-> linux/cd("Directory Changing") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") subgraph Lab Skills linux/echo -.-> lab-388815{{"シェルにおける条件文"}} shell/shebang -.-> lab-388815{{"シェルにおける条件文"}} shell/comments -.-> lab-388815{{"シェルにおける条件文"}} linux/logical -.-> lab-388815{{"シェルにおける条件文"}} shell/variables_decl -.-> lab-388815{{"シェルにおける条件文"}} shell/variables_usage -.-> lab-388815{{"シェルにおける条件文"}} linux/chmod -.-> lab-388815{{"シェルにおける条件文"}} linux/cd -.-> lab-388815{{"シェルにおける条件文"}} shell/if_else -.-> lab-388815{{"シェルにおける条件文"}} end

最初の 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:これは「シャバン」行と呼ばれます。これはシステムに対して、このスクリプトを実行するためのインタプリタを教えます。この場合、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:未満
  • -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

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

  1. 文字列の等価比較(=):これは 2 つの文字列がまったく同じかどうかをチェックします。
  2. 論理積(&&):この演算子を使うと 2 つの条件を組み合わせることができます。全体の式が真になるには、両方の条件が真である必要があります。
  3. 論理和(||):この演算子も 2 つの条件を組み合わせますが、全体の式が真になるには、ただ 1 つの条件が真であればよいです。
  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 se

いくつかの値を変更してみて(たとえば、STRING1を"hello"以外のものに設定して)、それが出力にどのような影響を与えるかを見てみましょう。

まとめ

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

要点:

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

覚えておいてください。シェルスクリプトに精通する鍵は練習です。これらの概念を使った独自のスクリプトを様々な方法で作成してみてください。進歩するにつれて、これらの条件文がより洗練された有用なスクリプトを作成するために欠かせないことがわかるでしょう。

OSZAR »