Bashシェルスクリプトでは、次の2つのステートメントの違い(ある場合)は何ですか?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
いくつかのスクリプトで2番目のスクリプトを作成していることに気付きましたが、使用すると同じことが実現することをここで読みました-z
。
2番目のものを使用する際に問題がある場合、最初のものが少し良く見えることを無視する必要がありますか?
Bashシェルスクリプトでは、次の2つのステートメントの違い(ある場合)は何ですか?
1.) if [ -z "$1" ]
2.) if [ "$1" = "" ]
いくつかのスクリプトで2番目のスクリプトを作成していることに気付きましたが、使用すると同じことが実現することをここで読みました-z
。
2番目のものを使用する際に問題がある場合、最初のものが少し良く見えることを無視する必要がありますか?
回答:
[ "$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年代後半のもの)は、通常の組み込みではなく特別な構文構造を使用することにより、オペランドが演算子として解析されるリスクを排除します。演算子は、二重括弧内に引用符で囲まずに文字どおりに表示する必要があり、変数展開を二重引用符で囲む必要はありません。