私はI say "Hello, World!"
答えようとしましたbash -c
。私が試したことは次のとおりです(一部)。
$ bash -c "echo I say \"Hello, World"'!'"\""
$ bash -c "echo I say "'"'"Hello, World"'!'"\""
$ bash -c "echo I say """Hello, World"""'!'
$ bash -c $'echo I say \"Hello, World!\"'
$ bash -c 'echo I say "Hello, World!"'
彼らはすべて印刷します
I say Hello, World!
見積もりはどのように表示できますか?
答え1
問題は、入れ子になった引用符があり、引用が多少複雑になることです。の引数への「完全」参照がないので、echo
すべての試行(3番目の試み(1)echo
除外)は実際に3つの引数をに渡します。見積もりの削除:
I
say
Hello, World!
重要なのは、「outer」コマンドを解釈すると、toパラメータの外部引用符がbash -c
削除されることです。内部引用符はエスケープされているか、外部引用符と型が異なるため、まだ存在します。
その後、bash
明示的に呼び出されたインスタンスがそのパラメータ(「内部」コマンド)を処理するときに呼び出しパラメータを解釈するときに、独自の引用符を削除しますecho
。したがって、あなたが引用した内容は、Hello, World!
これが考慮されることを保証します。一つただし、echo
同じプロセスから削除され失われますecho
。
("inner") コマンドはecho
変数拡張を必要としないので、次の単一引用符構文を使用します。
bash -c 'echo "I say \"Hello, World\"!"'
これによりパラメータを渡すことができecho
、二重引用符内で引用エスケープ処理が期待どおりに機能します。
(1)3番目の試みでは、実際に2つの引数を渡していますbash -c
。
echo I say Hello,
そしてWorld!
~につながる4つecho
「内部」コマンドで表示されるパラメーター。これは"""
、外部二重引用符を「中断」する方法が機能しないためです。代わりに、これらの二重引用符の最初のものは、引数の先頭二重引用符がスペースのbash -c
後ろで閉じられていることを意味します。その後、これは空の二重引用符で囲まれた文字列が次のように処理されます。引用しない Hello,
。これらの間にはスペースがないので、すべてが接続されます。
その後、次のスペースは保護されていないため、外部は残りの部分をbash
2番目の引数として処理します(二重引用符なし)、二重引用符で囲まれた空の文字列、および閉じられているがWorld
閉じられていない二重引用符文字列で始まります'!'
。正しく閉じられていないという事実は、「イベントが見つかりません」というエラーメッセージで隠されています。開く二重引用符は、次の一重引用符を印刷する単一の文字で作成し、したがって記録参照!
用に解釈されなくなるためです。
答え2
POSIX準拠に興味がない場合は、-e
(16進数)または(8進数)echo
ASCIIコードを追加して印刷して"
問題を解決できます。\x22
\042
bash -c 'echo -e "I say \x22Hello, World\x22"'
bash -c 'echo -e "I say \042Hello, World\042"'