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

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

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

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

私はいくつかのスクリプトで2番目のスクリプトを書いていることを発見しました。ここを使用しても-z同じ効果が得られます。

2番目のものを使用することが問題になる場合は、もっと見やすくするために最初のものを無視する必要がありますか?

答え1

[ "$1" = "" ][ -z "$1" ]Bashや他のPOSIX互換シェルでも同じように機能します。 (単語を形成しない文字(例:)がない限り、角括弧の両側にスペースが必要です;。)

[他のシェルと同様に、組み込みシェルです。実際にスペルを入力することもできますtest(2つの間の唯一の違いは、最後の引数として[aが必要であることです)。]したがって、拡張を実行すると、[ "$1" = "" ]テスト演算子は3つのパラメータと空の文字列を確認します。やや年齢が多い$1-z-z=式全体にあいまいさがないにもかかわらず、オペランドがこのように演算子のように見えると、シェルは時々解析エラーを引き起こします。実際、どのバージョンでこの特定の表現に問題があるかはわかりませんが、より複雑な表現のために失敗する可能性があります。バグのあるバージョンもサポートされていない可能性があります[ -z "$1" ]。共通のシェルイディオムはです[ x"$1" = x"" ]。演算子は文字で始まらないため、オペランドを演算子として解析するリスクはありません。

ksh、bash、zshでは二重角括弧構文を使用できます[[ -z $1 ]]。この最新の構文(1970年代半ばではなく1980年代後半)では、オペレーターのリスクは、通常の組み込み構文の代わりに特殊構文構成を使用してオペランドを解析する必要はありません。 。演算子は文字通り現れ、二重括弧内に引用符を含めないでください。二重引用符で囲まれた変数拡張は必要ありません。

関連情報