等しくないの構文は重要ですか?

等しくないの構文は重要ですか?

スクリプトを書くとき、通常、次の構文を使用すると、次に何が起こるのかが正しくないことを理解しやすくなります。

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のdash0.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" ]

古いシステムに移植したいスクリプトから。

おすすめ記事