[“ $ VAR” =“”]と[-z“ $ VAR”]は常に同等ですか?


8

私のコードは次のようになります:

VAR=""

while [ -z "$VAR" ]; do
  VAR=$( command | grep "important_string" )
done

の出力をポーリングしてcommandimportant_stringが表示されてに入れられるようにし$VARます。

との間に機能的な違いは[ -z "$VAR" ]あり[ "$VAR" = "" ]ますか?


3
==は構文が正しくありませんが、多くのシェルで機能します(おそらく他の言語を使用している人にとっては非常に重要なメモリだからです)。を使用する必要があります=
l0b0

@ l0b0が==からコピーしました。私の間違い。
Minix

回答:


5

はい([ -z "$VAR" ][ "$VAR" = "" ]...)は同等です。両方が$VAR空かどうかをテストしています(バインドされていない、または空の文字列に設定されている場合など)。

でコメントしたようCelada、悪い事は、使用する際に起こる可能性がある[ "$VAR" = "" ] 場合にはVAR、いくつかの有効なテストがある(場合などVARである-z)、特にとき[(またはtest)でないシェル組み込み。しかし、bashまたはzshそれ[は組み込みであり、それは問題ではないようです。[ "x$VAR" = "x" ]テストに使用できます。test(1)を参照してください

もちろん、POSIXシェルなどを想定しています。

おそらく-z少し速いかもしれませんが(シェルスクリプトではマイクロ秒は気にしないでください)、=おそらくもっと読みやすいかもしれません。


5
[ "$VAR" = "" ]の内容が$VARハイフンで始まる場合、構文エラーが発生するため、確かにそれは間違いでした。たとえば、$VARcontainsの場合は-z、次のように展開さ[ -z = "" ]れます。つまり=、空かどうかをテストします(そうではありません)。そして""、無関係な議論として扱いますか?しかし、私はあなたの答えを読んだ後でそれを試してみたので、そのように失敗するようには思えません!私は何十年もの間、おそらく不必要に[ "x$VAR" = "xfoo" ]特殊文字から身を守るためのような構造を使用してきました$VAR
Celada

@セラダ:あなたのポイントは、が組み込まれていない珍しいシェルに当てはまると思いますtest
Basile Starynkevitch、2015

1
拡張に関しては、シェル組み込みは外部コマンドと同じように動作するはずだと思います。[[bashのようなキーワードと混同しませんでしたか?彼らは本当に違います。--- testbashのビルトインでの変数の展開に関する特別な動作は確認していません。
pabouk 2015

私はでテストzsh
バジーレStarynkevitch

@Celada実は、あなたの言う通り、間違って使う[ "$VAR" = "" ]ことができるものがたくさんあるので、-z代わりに使う方が安全です。
Braiam 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.