[シェルスクリプト] [ -a ][ -o ]が POSIX では Obsolescent になっていた?

2017年10月10日火曜日

bash unix シェルスクリプト

[ -a ]

シェルスクリプトで変数の値が0と100の間にあるかどうか、確認するときはこんなふうに書いたりする。

$ i=100
$ if [ $i -ge 0 -a $i -le 100 ] ;then echo "$i"; fi
100

testコマンドの条件の間に -a を入れることによって前後の条件式を and で結んでいる。

ところが。だ。

POSIX 2008

IEEE Std 1003.1-2008, 2016 Edition
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html
test - evaluate expression
operands

によると

expression1 -a expression2
expression1 -o expression2
[OB XSI] Obsolescent
The functionality described may be removed in a future version of this volume of POSIX.1-2008.

となっている。
つまり、そのうちなくなるよってこと。

シェルスクリプトの本でも and, or は [ -a ] [ -o ] を使うよって、書いてあるものもあるのに、なんてこった!

じゃあ、どうするか

じゃあ、どうするかというと、コマンドが成功/失敗した時だけ、次のコマンドを実行する書き方を思い出そう。

$ i=100
$ if [ $i -ge 0 ] && [ $i -le 100 ] ;then echo "$i"; fi
100

もちろん、or の場合は || を使おう。

$ if [ "$foo" = 'foo' ] || [ "$foo" = 'bar' ] ;then echo "$foo"; fi

うーん、確かにtestコマンドに複数の条件式を判定させるよりも、こちらの方が理にかなっている気がする。

[参考文献]
Bashのよくある間違い