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


28

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

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

いくつかのスクリプトで2番目のスクリプトを作成していることに気付きましたが、使用すると同じことが実現することをここで読みまし-z

2番目のものを使用する際に問題がある場合、最初のものが少し良く見えることを無視する必要がありますか?


3
詳細な比較については、スタックオーバーフローに関する私の回答を参照してください。また、これthisを参照してください。
追って通知があるまで一時停止します。

素敵なリンク、いくつかの素敵な答え:)
ヨハン

回答:


36

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

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

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


角かっこの横にスペースがないという誤植を修正しました。
ヨハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.