他の文字列/整数を比較するときに一重引用符を使用するのは間違っていますか?
私はスクリプトで一重引用符と二重引用符の両方を使用しましたが、ほとんどの場合は機能しますが、スクリプトの一貫性を維持するための規則が必要です。
それでは、どの部分にどの文章を使用しなければなりません。
答え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"