it-swarm-ja.tech

Bashでは、[-z "$ 1"]と["$ 1" = ""]は同じですか?

Bashシェルスクリプトで、次の2つのステートメントの違い(ある場合)は何ですか?

1。)if [ -z "$1" ]
2。)if [ "$1" = "" ]

私はいくつかのスクリプトで2番目のものを書いているのを見つけましたが、それから here-zは同じことを実現します。

2番目の問題の使用に問題がある場合、最初の問題が少し良く見えることを無視すべきでしょうか?

29
Johan

[ "$1" = "" ][ -z "$1" ]は、bashと他のPOSIX準拠のシェルではまったく同じです。 (;のような単語を構成しない文字がない限り、角括弧の両側にスペースが必要です。)

[は、他と同じように組み込みのシェルです。実際、testと表記することもできます(2つの違いは、[が最後の引数として]を必要とすることです)。したがって、[ "$1" = "" ]$1に拡張して-zを実行すると、テストオペレーターには-z=、空の文字列の3つの引数が表示されます。一部の古い Bourne シェルは、完全な式にあいまいさがなくても、オペランドがこのように演算子のように見えると、解析エラーをスローすることがありました。この特定の式で実際に問題があったバージョンがあったかどうかはわかりませんが、より複雑な式を使用すると、それらが破棄される可能性があります。空の単語で問題があったバージョンもあったかもしれません。これらも[ -z "$1" ]をサポートしていなかったでしょう。一般的なシェルイディオムは[ x"$1" = x"" ]です。演算子が文字で始まっていないため、オペランドが演算子として解析されるリスクを回避できます。

Ksh、bash、およびzshでは、二重ブラケット構文[[ -z $1 ]]を使用できます。この新しい構文(1970年代半ばではなく1980年代後半から)は、通常の組み込みではなく特別な構文構造を使用して、オペランドを演算子として解析するリスクを排除します。演算子は、二重括弧内で引用符で囲まずに文字どおりに表示する必要があり、変数展開を二重引用符で囲む必要はありません。