シェル:-n/-zで二重引用符のみをテストしますか? [コピー]

シェル:-n/-zで二重引用符のみをテストしますか? [コピー]

たとえば、次のような場合ですtest -e

VAR="<this is a file path: /path/to/file/or/dir"
test -e $VAR && do_something || do_anotherthing

"$VAR"Q:これをここで使用する必要がありますか?必要でない場合は、ここで詳細が好きではありません。これは$VAR明らかにこの場合はパスであるため、空の文字列の場合、パスが空の文字列ではないため、常に失敗する必要があり、私のロジックによると、二重引用符は必要ありません。

ただし、文字列テストの場合、test -n は次のようになります。

VAR="<this is a string"
test -n $VAR && do_something || do_anotherthing

それから私のロジックによると、$VAR二重引用符で囲む必要があります。"$VAR"空の文字列に展開できるため、二重引用符でない場合はパラメータとしてのみ拡張され、-n常にtrueです。

したがって、実際の質問は、テストコマンドで文字列-nと文字列に-z二重引用符を使用する必要があるかどうか疑問です。

ベストアンサー1

一般的な規則は、シェルがその内容に対してトークン分割とワイルドカード拡張を実行したくない限り、すべての変数を二重引用符で囲むことです。

明らかに$VARこの場合はパスなので、空の文字列であれば常に失敗しなければなりません。 [...]私のロジックによると、二重引用符は必要ありません。

正反対。オペランドのない動作は、test -eこの特別な場合に変数を引用する必要があるもう1つの理由です。

$ unset foo      # or foo=""
$ test -e $foo   # note this is equivalent to `test -e'
$ echo $?
0
$ test -e "$foo"
$ echo $?
1
$

おすすめ記事