このページで解説している内容は、以下の 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
コマンド以外にも、grep
やgroups
などのコマンドの終了ステータスを利用できます。 - 柔軟な条件判定:論理演算子を活用することで、複雑な条件判定を簡潔に表現できます。
これらの知識を活用して、シェルスクリプトでより効率的な条件分岐を実現しましょう。