Bashで整数、文字列、およびバイナリを比較するときは、どの引用符(単一または二重)を使用する必要がありますか?その理由は何ですか?

Bashで整数、文字列、およびバイナリを比較するときは、どの引用符(単一または二重)を使用する必要がありますか?その理由は何ですか?

他の文字列/整数を比較するときに一重引用符を使用するのは間違っていますか?

私はスクリプトで一重引用符と二重引用符の両方を使用しましたが、ほとんどの場合は機能しますが、スクリプトの一貫性を維持するための規則が必要です。

それでは、どの部分にどの文章を使用しなければなりません。

ベストアンサー1

比較時に単一引用符を使用するか二重引用符を使用するかを選択する際の注意事項は次のとおりです。

拡張機能は機能する必要がありますか?

一重引用符は、基本的に文字列のリテラル値が必要なことを意味します。したがって、通常は変数を比較しようとしているので、比較したいほとんどの場合には実際には役に立ちません。 「$variable1」と「$variable2」を比較します。毎回間違った結果が出ます。、変数値ではなくリテラル文字列を比較することになるからです。

二重引用符はまだいくつかの拡張を許可します(man bash詳細についてはページの引用符のセクションを参照してください)。上記の例では、「$variable1」と「$variable2」を実際に変数に含まれる値に展開して比較します。

空の文字列に注意してください!

を使用してtest文字列値を比較するときに、空の文字列を二重引用符で囲むことなく拡張すると、次のような結果が生じる可能性があることに注意してください。文法エラー。たとえば、次のコードを実行するとエラーがないと思います。

str="STRING"
if [ $str = "STRING" ]; then
    echo "EQUAL"
fi

しかし、ある時点で空の文字列がある場合、bashは単項演算子が必要であると文句を言います。これは、コードが次に拡張されるためです。

str=""
if [ = "STRING" ]; then
    echo "EQUAL"
fi

そして=後ろにパラメータが1つしかありませんが、単項演算子ではありません。これを回避するには、比較時に変数名を二重引用符で囲みます。

str="STRING"
if [ "$str" = "STRING" ]; then
    echo "EQUAL"
fi

引用符を選択するときに注意する必要がある他のものがあります(たとえば、特定の特殊文字をエスケープするなど)。$、`、\と!履歴拡張が有効な場合- 二重引用符を使用)。ただし、デフォルトでリテラル文字列が必要な場合は、単一引用符を使用してください。機能するために拡張が必要な​​場合は、二重引用符を使用してください。必要に応じてそれらを混在させることもできます(これはいくつかの脱出を防ぎます)。

hello='Hello World'
mystring="$hello"'!'
echo "$mystring"

おすすめ記事