スクリプトを書くとき、通常、次の構文を使用すると、次に何が起こるのかが正しくないことを理解しやすくなります。
if [ ! "$1" = "$2" ]; then
一部の人々は、次の方法が良いと言います。
if [ "$1" != "$2" ]; then
問題は、なぜ、どのような違いがあるのか尋ねたとき、誰も答えができないようだということです。
それでは、これら2つの構文の間に違いはありますか?一方が他より安全ですか?それともこれは単に好み/習慣の問題ですか?
ベストアンサー1
[ ! "$a" = "$b" ]
装飾/デフォルト設定パラメータに加えて、特別な場合に失敗する実装率が理由の1つである可能性があります[ "$a" != "$b" ]
。
実装が次の場合、どちらの場合も安全でなければなりません。POSIXアルゴリズムしかし、今日(この記事を書く時点である2018年初め)でも、まだ失敗した実装があります。たとえば、次のようになりますa='(' b=')'
。
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
0.5.9より前のバージョン(例:Ubuntu 16.04のdash
0.5.8):sh
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(0.5.9で修正されました。参照)https://www.mail-archive.com/[Eメール保護]/msg00911.html)
これらの実装ではこれをそのまま処理[ ! "(" = ")" ]
( "text" が空文字列かどうか[ ! "(" "text" ")" ]
テスト ) するのに対し、 POSIX ではこれを義務化します ("x" と "y" が等しいかテスト)。この場合、誤ったテストを実行するため、これらの実装は失敗します。[ ! "text" ]
[ ! "x" = "y" ]
他の形式もあります。
! [ "$a" = "$b" ]
これにはPOSIXシェルが必要です(以前のBourneシェルでは使用できませんでした)。
気づく一部の実装[ "$a" = "$b" ]
では(and)問題も発生しました。[ "$a" != "$b" ]
そしてまだSolaris 10の[
組み込み機能/bin/sh
(Bourneシェル、のPOSIXシェル/usr/xpg4/bin/sh
)と同じです。そのため、次の内容が表示されます。
[ "x$a" != "x$b" ]
古いシステムに移植したいスクリプトから。