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

Linuxコマンドの基本:シェルスクリプトのtestコマンドと演算子

シェルスクリプトのtestコマンドと演算子

 if 文について理解できたところで、ここから [ ] コマンド(testコマンド)の条件式について詳しく見ていきましょう。「シェルスクリプトのコマンドと終了ステータス」では [ ] を用いて2つの文字列が一致するかどうかを判定しましたが、これ以外にも多くの評価演算子が用意されており、さまざまな条件判定を行うことができます。

 なお、[ ]test コマンドとほぼ同じ機能を持ち、この2つのコマンドは最後に引数 ] を取るか取らないかという点を除いて同じ動きをします。そのため、次の2つの if 文は同じ意味となります。

if [ "$1" = "ok" ]; then
if test "$1" = "ok"; then

 [ ] コマンドを利用した方が読みやすくなるため、if 文で条件比較をする場合には一般的に [ ] の方が利用されます。[ ] コマンドというのは発音もしにくいため、[ ]test の両方をまとめてtestコマンドと呼びます。

文字列の比較

 まずは、文字列を比較する演算子を紹介します。これは、ここまで例に挙げてきた = など、文字列を評価するための演算子です。

演算子内容
str1 = str2str1str2 が等しい
str1 != str2str1str2 が等しくない
-n strstr が空文字列ではない
-z strstr が空文字列である

 ここで、str1str2 というのは任意の文字列を意味しています。例を見てみましょう。-z は、対象が空文字列であれば真となります。これは変数に値がセットされているかどうかの判定に利用できます。

例:変数の値が空文字列ならばデフォルト値をセット

filename=$1
if [ -z "$filename" ]; then
 filename="default.log"
fi

 上の例は、コマンドライン引数からファイル名を指定するシェルスクリプトの一部です。-z で変数 filename の値を確認し、空ならば filename="default.log" というデフォルト名をセットする処理です。こうして、値の指定を省略した場合には、デフォルト値をセットするというシェルスクリプトを書くことができます。

整数の比較

 次に整数値を比較する演算子を紹介します。下の表で、int1int2 というのは任意の整数値を指します。

演算子意味
int1 -eq int2int1int2 が等しい
int1 -ne int2int1int2 が等しくない
int1 -lt int2int1int2 より小さい
int1 -le int2int1int2 以下
int1 -gt int2int1int2 より大きい
int1 -ge int2int1int2 以上

 それでは例を見てみましょう。次のシェルスクリプトでは、-lt 演算子を使って2つのコマンドライン引数を比較し、大きい方をシェル変数 max に代入しています。

例:2つの引数から大きい方をシェル変数 max に代入する (if-max.sh)

スクリプトの作成

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

if-max.sh の内容

#!/bin/bash
num1=$1
num2=$2
max=$num1

if [ "$num1" -lt "$num2" ]; then
    max=$num2
fi

echo "The larger number is $max"

実行権限の付与

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

スクリプトの実行

user01@ubuntu:~$ ./if-max.sh 5 9
The larger number is 9

 なお、これらの演算子は整数しか扱えないことに注意してください。上の例で小数を指定すると、次のようにエラーとなります。

user01@ubuntu:~$ ./if-max.sh 2.7 6.1
./if-max.sh: line 6: [: 2.7: integer expression expected
The larger number is 2.7

 小数や非数値を比較する場合には、別の方法(例えば bc コマンドや awk)を使用する必要があります。

もう一つの例:数値が正か負かを判定する (if-sign.sh)

 次に、コマンドライン引数で与えた数値が正の数か負の数か、またはゼロかを判定するスクリプトを作成してみましょう。

スクリプトの作成

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

if-sign.sh の内容

#!/bin/bash
num=$1

if [ "$num" -gt 0 ]; then
    echo "$num is positive."
elif [ "$num" -lt 0 ]; then
    echo "$num is negative."
else
    echo "$num is zero."
fi

実行権限の付与

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

スクリプトの実行

正の数の場合

user01@ubuntu:~$ ./if-sign.sh 10
10 is positive.

負の数の場合

user01@ubuntu:~$ ./if-sign.sh -5
-5 is negative.

ゼロの場合

user01@ubuntu:~$ ./if-sign.sh 0
0 is zero.

 このスクリプトでは、ifelifelse を使って複数の条件を判定しています。数値が 0 より大きければ正、0 より小さければ負、そうでなければゼロと判定します。

不要になったファイルの削除

作成したシェルスクリプトが不要になった場合は、以下のコマンドで削除できます。

user01@ubuntu:~$ rm if-max.sh if-sign.sh

まとめ

  • [ ]test コマンド:条件式を評価するためのコマンドで、if 文と組み合わせて条件分岐を実現します。
  • 文字列の比較演算子=!=-n-z を使って文字列の等価性や空文字列の判定ができます。
  • 整数の比較演算子-eq-ne-lt-le-gt-ge を使って整数の大小や等価性を判定できます。ただし、小数や非数値は扱えないので注意が必要です。
  • if 文の活用:条件式と組み合わせることで、入力値に応じた柔軟な処理が可能になります。
  • エラー対策:数値比較では整数のみを扱うため、入力値の検証やエラーハンドリングも重要です。

 これらの知識を活用して、シェルスクリプトでより複雑な条件判定や処理の分岐を実装してみてください。