このページで解説している内容は、以下の YouTube 動画の解説で見ることができます。

Linuxコマンドの基本:シェルスクリプト:if文と&&の活用

シェルスクリプト:if文と&&の活用

 シェルスクリプトでは、if 文と論理演算子を組み合わせることで、複数の条件を効率的に評価できます。特に、&&(AND)演算子を使用すると、複数のコマンドの終了ステータスがすべてゼロ(真)である場合にのみ処理を実行することが可能です。ここでは、if 文と && を活用した条件分岐の方法について詳しく解説します。

if文での && の利用

 if 文で && を利用すると、複数の条件を連結し、それらすべてが真の場合にのみブロック内の処理が実行されます。これは、複数の test コマンドや他のコマンドを組み合わせて、複雑な条件を簡潔に表現するのに役立ちます。

例1:数値の範囲を判定するスクリプト(if-range.sh

 以下のスクリプトでは、コマンドライン引数で与えられた数値が 5 より大きく、かつ 10 未満であるかを判定します。

スクリプトの作成

user01@ubuntu:~$ nano if-range.sh

if-range.sh の内容

#!/bin/bash

num=$1
if [ "$num" -gt 5 ] && [ "$num" -lt 10 ]; then
    echo "The number $num is greater than 5 and less than 10."
else
    echo "The number $num does not meet the criteria."
fi

解説

  • num=$1:コマンドライン引数から数値を取得します。
  • [ "$num" -gt 5 ]num が 5 より大きいかを判定します。
  • [ "$num" -lt 10 ]num が 10 より小さいかを判定します。
  • &&:両方の条件が真の場合にのみ、then ブロックが実行されます。

実行権限の付与

user01@ubuntu:~$ chmod +x if-range.sh

スクリプトの実行例

条件を満たす場合

user01@ubuntu:~$ ./if-range.sh 7
The number 7 is greater than 5 and less than 10.

条件を満たさない場合

user01@ubuntu:~$ ./if-range.sh 4
The number 4 does not meet the criteria.

解説

  • 7 は条件を満たすため、指定したメッセージが表示されます。
  • 4 は条件を満たさないため、別のメッセージが表示されます。

例2:ユーザーの所属グループを確認するスクリプト(if-group.sh

 以下のスクリプトでは、現在のユーザーが sudo グループに所属しており、かつホームディレクトリが存在するかを確認します。

スクリプトの作成

user01@ubuntu:~$ nano if-group.sh

if-group.sh の内容

#!/bin/bash

username=$(whoami)
if groups "$username" | grep -q '\bsudo\b' && [ -d "/home/$username" ]; then
    echo "User $username is in the sudo group and has a home directory."
else
    echo "User $username does not meet the criteria."
fi

解説

  • username=$(whoami):現在のユーザー名を取得します。
  • groups "$username":ユーザーの所属グループを表示します。
  • grep -q '\bsudo\b'sudo グループに所属しているかを確認します。
  • [ -d "/home/$username" ]:ホームディレクトリが存在するかを確認します。
  • &&:両方の条件が真の場合にのみ、then ブロックが実行されます。

実行権限の付与

user01@ubuntu:~$ chmod +x if-group.sh

スクリプトの実行例

user01@ubuntu:~$ ./if-group.sh
User user01 is in the sudo group and has a home directory.

解説

  • 現在のユーザーが sudo グループに所属し、ホームディレクトリが存在する場合に条件を満たします。

if文での || の利用

if 文で || を利用すると、複数の条件のうちいずれかが真の場合に処理を実行できます。

例3:コマンドライン引数のチェック(if-arg.sh

 以下のスクリプトでは、コマンドライン引数が "start" または "stop" のいずれかであるかを判定します。

スクリプトの作成

user01@ubuntu:~$ nano if-arg.sh

if-arg.sh の内容

#!/bin/bash

action=$1
if [ "$action" = "start" ] || [ "$action" = "stop" ]; then
    echo "Action is $action."
else
    echo "Invalid action: $action"
fi

解説

  • action=$1:コマンドライン引数からアクション名を取得します。
  • [ "$action" = "start" ]action"start" であるかを判定します。
  • [ "$action" = "stop" ]action"stop" であるかを判定します。
  • ||:いずれかの条件が真の場合に、then ブロックが実行されます。

実行権限の付与

user01@ubuntu:~$ chmod +x if-arg.sh

スクリプトの実行例

有効なアクションの場合

user01@ubuntu:~$ ./if-arg.sh start
Action is start.
user01@ubuntu:~$ ./if-arg.sh stop
Action is stop.

無効なアクションの場合

user01@ubuntu:~$ ./if-arg.sh restart
Invalid action: restart

解説

  • "start" または "stop" の場合、アクションが表示されます。
  • それ以外の場合、無効なアクションとしてエラーメッセージが表示されます。

作成したスクリプトの削除

user01@ubuntu:~$ rm if-range.sh if-group.sh if-arg.sh

まとめ

  • if 文と && の組み合わせ:複数の条件がすべて真の場合にのみ処理を実行できます。
  • if 文と || の組み合わせ:複数の条件のうち、いずれかが真の場合に処理を実行できます。
  • 条件式の記述[ ] 内で条件式を記述し、論理演算子で結合します。
  • コマンドの活用test コマンド以外にも、grepgroups などのコマンドの終了ステータスを利用できます。
  • 柔軟な条件判定:論理演算子を活用することで、複雑な条件判定を簡潔に表現できます。

これらの知識を活用して、シェルスクリプトでより効率的な条件分岐を実現しましょう。