入力属性として一重引用符に含まれる二重引用符を使用するアプリケーションがあります。たとえば、次の正しいコマンドを使用します。
command -p 'cluster="cl1"'
自動化するために、bashファイルを$CLUSTER
変数にしました。私の命令はどのようなものでなければなりませんか?つまり、cl1の代わりに何を使うべきですか?
上記のコマンドを変更しても許可されません。例:command -p "cluster=cl1"
許可されていません
答え1
あなたのコマンドは、コマンドラインで提供されたパラメータに基づいて環境変数を設定するようです。おそらく次のようにすることができます:
CLUSTER=cl1; cluster=$CLUSTER command
...そして呼び出し時に環境を設定します。
それ以外の場合、シェル引用符は通常引数を分離するか、シェル解釈から他の特殊なシェル文字をエスケープします。含めることができます(だから脱出)さまざまな規則に応じて、さまざまな種類のさまざまなシェル引用符:
"''''"
- ソフト引用符で囲まれた文字列には、複数のハード引用符を含めることができます。"\""
- バックスラッシュは\
ソフト参照文字列"
内でソフト参照をエスケープできます。"
- この場合、
\\
バックスラッシュも以下に説明するようにそれ自体でエスケープされ、\$
拡張タグと\n
行が減りますが、文字通り処理されます。
- この場合、
"${expand} and then some"
- ソフト参照文字列には、解釈されたシェル$
拡張を含めることができます。'"\'
- ハードクォート文字列には、ハード引用符を'
除く任意の文字を含めることができます。'
\
- 引用符で囲まれていないバックスラッシュは、リテラル解釈のために後続の文字(他のバックスラッシュでも)をエスケープします(\n
ewlineを除く)。- ewlineの
\\n
場合、生成された解析コマンドから\
バックスラッシュとewlineの両方が完全に削除されます。\n
- ewlineの
${parameter+expand "$parameter"}
- いくつかの特別な場合を除いて、シェル拡張で生成された引用符は区切り文字としてほとんど使用されません。ここではこれについてもう説明しません。
私の考えでは、すべてのアプリケーションがコマンドライン引数の引用符を解釈するのは奇妙だと思います。これはあまり意味がありません - 少なくともシェルでは - 引用の主な目的は、一般的に引数を区切ることです。しかし呼び出されると、引数は常に境界が描かれました文字が含まれているので、\0NUL
引用はあまり効果がありません。
シェルでさえ、スイッチを使用して呼び出すと、通常は呼び出しパラメータの1つの引用符のみが解釈されます-c
。オペランド実際に呼び出されたときに実行する必要があるシェルスクリプト。これは事件です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
a の区切り文字を引用しない場合、<<here-document
ほとんどすべての内容が"
ソフト参照として扱われます。とは別に二重"
引用符自体は特に処理されません。したがって、上記のコードを実行するとcat
:
CLUSTER=cl1
cat <<-SCRIPT
cluster="$CLUSTER"
SCRIPT
...印刷されます...
cluster="cl1"
答え2
良いマックサイフ書いた:
CLUSTER='"cl1"'; command -p "cluster=$CLUSTER"
スペース/メタ文字を含むすべてのリテラルは「二重引用符」として扱われます。すべて拡張:"$var"
、、、、。"$(command "$var")"
コードやテキストについてはを参照してください。"${array[@]}"
"a & b"
'single quotes'
$'s: 'Costs $5 US'
ssh host 'echo "$HOSTNAME"'
http://mywiki.wooledge.org/Quotes
http://mywiki.wooledge.org/Arguments
http://wiki.bash-hackers.org/syntax/words