Shell:["$myvar" = 0]の代わりに[x"$myvar" = x0]の理由/テスト変数にアルファ文字を追加するのはなぜですか? [コピー]

Shell:[

どこかに重複したものがあるかもしれませんが(私の考えでは)見つかりませんでした。

一部のスクリプトでこのようなテストが表示されるのはなぜですか?

if [ x"$quiet_boot" = x0 ]

xテストの実際の変数の前に1つを追加しますか?確認しましたこの関連質問ただし、シェルが設定されていない変数を使用するとすぐにスクリプトを停止するように設定されている場合は、設定されていない変数の問題を回避したいと思います。

では、ここでこれを使用するのはなぜですか?

なぜそれを書かないのですif [ "$quiet_boot" = 0 ]か?

ベストアンサー1

実際に見つけました。繰り返す第二)この質問を書いている間...

文字プレフィックスを追加することは実際に回避策です。一部(ほとんどのレガシー)test(別名[)シェルコンテキストでのユーティリティの実装。たとえば、myvar等しい場合-o、または場合-nによって(は演算子と混同される可能性があります(sayプレフィックスを追加するとこれを防ぐことができますx)。ただし、シェルは意図的に機能するため、コマンドはtest引数を受け取ると、指定された特定の引数が演算子かオペランドかを判断できません。

私のtest(1)マニュアルは次のように警告します。

注:バイナリ-aと-oは本質的にあいまいです。 「Test EXPR2」の代わりに「Test EXPR1 && Test EXPR2」または「Test EXPR1 ||」を使用してください。

今日の私のダッシュshの実装は次のとおりです。

b="("
test "AAA" = "AAA" -a "$b" = "BBB"
# yields "test: closing paren expected"

x"$b" = x"BBB"これは、2つのテストに合格または通過することで回避できますtest "AAA" = "AAA" && test "$b" = "BBB"

a='='
b=x
test -n "$a" -a -n "$b"
# yields test: -a: unexpected operator

"$empty" = ""これは、(代わりに-n)if-aまたは使用を使用して回避できるあいまいさを示しています。-oしたがってx"$empty" = x、この場合、角括弧の問題を解決するためにプレフィックス()が使用されます。


一般的に、今は次のようになります。

  • 1つだけを実行するのは安全でありtest(最大3つのパラメータ、use-oまたはuseなし-a)、この回避策は必要ありません(古い/バグのある実装を除く)。
  • -o/ を使用すると-a、特にオペランドが演算子や角括弧 /(のように見えるときにあいまいでバグが発生することがあります。この回避策が役立ちます。)

安全性を確保するには、空白が含まれていても常に引数として解釈されるように渡された引数を"$variables"常に引用する必要があります。test

詳しくは、スティーブン・チャジェラス書いたかなり包括的な答えこの質問を読んでください。より多くの手がかりがより簡単に見つけることができる情報を指すように、この質問と回答を投稿し続けています。

今日の実装は、不明瞭な動作を引き起こす多くの従来の実装の問題を修正するため、これらの問題に対してsayまたはsayをx使用しない-oテストをプレフィックスとして指定する-aことはしばしば不要です。

おすすめ記事