コマンドがコマンドラインで指定された引数に基づいて環境変数を設定している可能性があります。それはあなたができるかもしれません:
CLUSTER=cl1; cluster=$CLUSTER command
...呼び出し時にその環境を設定します。
それ以外の場合、通常、シェルの引用符は引数を区切るか、他の特殊なシェル文字をシェルの解釈からエスケープします。さまざまな規則に基づいて、他の種類の中に異なる種類のシェル引用符を含める(したがってエスケープする)ことができます。
"''''"
-ソフトクォートされた文字列には、ハードクォートをいくつでも含めることができます。
"\""
- \
バックスラッシュは、"
ソフトクォート"
された文字列内のソフトクォートをエスケープできます。
- このコンテキストでは、
\\
バックスラッシュも以下に示すように、それ自体、\$
展開トークン、および\n
ewlinesをエスケープしますが、それ以外の場合は文字どおりに扱われます。
"${expand} and then some"
-ソフトクォートされた文字列は解釈されたシェル$
展開を含むことができます。
'"\'
- '
ハード'
クォートされた文字列には、ハードクォート以外の文字を含めることができます。
\
-引用符で囲まれていないバックスラッシュは、文字どおり解釈するために後続の文字をエスケープします-もう1つのバックスラッシュでさえ\n
-ewline を除きます。
- で
\\n
ewlineケースの両方\
バックスラッシュと\n
ewline完全得解釈コマンドから除去されます。
${parameter+expand "$parameter"}
-いくつかの特別な場合を除いて、シェル展開から得られる引用符が区切り記号として機能することはほとんどありません。ここでは、これらについてさらに説明するつもりはありません。
どのアプリケーションもコマンドライン引数の引用符を解釈するのは奇妙だと思います。そのような慣行は、シェルでは少なくとも意味がありません。少なくとも、引用符の主な目的は、一般的に引数を区切ることです。ただし、呼び出し時には、引数は常に文字で区切られて\0NUL
いるため、引用符はあまり目的に使用できません。
シェルであっても、-c
スイッチで呼び出された場合、通常、呼び出し引数の1つで引用符を解釈するだけで済みます。これは、最初のオペランドが実際に呼び出し時に実行するシェルスクリプトであることを示します。これは、2回評価された入力の場合です。
そうは言っても、コマンドラインの引数を介してリテラル引用符を渡すために多くのことを行うことができます。例えば:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
以前のコメントで述べたように、"
それ自体が"
引用されている展開内に引用符を含めることができます。
CLUSTER=cl1; command -p "cluster=\"$CLUSTER\""
引用符で囲まれた文字列内でバックスラッシュを使用"
して\
エスケープでき"
ます。
CLUSTER=cl1; command -p cluster='"'"$CLUSTER"'"'
上記の @jimmijの注記のように、希望する最終結果に到達するために、引用スタイルを交互に連結することができます。
CLUSTER=cl1; ( set -f; IFS=; command -p cluster=\"$CLUSTER\" )
ファイル名の生成と$IFS
分割の両方を無効にして、引用符$expansion
をまったく引用する必要をなくし、引用符だけを引用することができます。これはおそらくやり過ぎです。
最後に、使用できる別のタイプのシェル引用があります。前述のように、sh -c "$scriptlet"
シェル呼び出しの形式は、コマンドラインでシェルのスクリプトを提供するためによく使用されます。$scriptlet
ただし、引用符が他の引用符を含む必要がある場合など、複雑になる場合は、ヒアドキュメントを使用する方が有利な場合が多く、sh -s
代わりに、ケースのように、次のすべてのオペランドを位置パラメータに割り当てるようにシェルに具体的に指示します。-c
また、そのスクリプトもから取得しますstdin
。
コマンドがこのように引用符を解釈する必要がある場合は、ファイル入力で解釈できればより良いと考えます。例えば:
CLUSTER=cl1
command --stdin <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
の区切り文字を引用符で囲まないと、<<here-document
そのすべての内容は、"
ソフトクォートされたのとほぼ同じように扱われます。ただし、"
二重引用符自体は特別に扱われません。そして、cat
代わりに上記を実行すると:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
...印刷します...
cluster="cl1"
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"