repo
コマンドは、それを取得引用符の種類を気にすることはできません。パラメータの展開が必要な場合は、二重引用符を使用してください。それはあなたが多くのものをバックスラッシュする必要があることを意味するなら、それの大部分に一重引用符を使用し、それからそれらを抜け出して、展開が起こる必要がある部分のために二重に行きます。
repo forall -c 'literal stuff goes here; '"stuff with $parameters here"' more literal stuff'
興味があれば説明します。
シェルからコマンドを実行する場合、そのコマンドが引数として受け取るのは、ヌル終了ストリングの配列です。これらの文字列は絶対に含まれていてもよい任意の null以外の文字が。
ただし、シェルがコマンドラインからその文字列の配列を構築している場合、一部の文字は特別に解釈されます。これは、コマンドをより簡単に(実際に)入力できるように設計されています。たとえば、スペースは通常、配列内の文字列間の境界を示します。そのため、個々の引数は「単語」と呼ばれることもあります。しかし、それでも引数にはスペースが含まれる場合があります。必要なことをシェルに伝える方法が必要なだけです。
任意の文字(スペース、または別のバックスラッシュを含む)の前にバックスラッシュを使用して、シェルにその文字を文字どおりに処理するように指示できます。しかし、あなたはこのようなことをすることができますが:
echo \"Thank\ you.\ \ That\'ll\ be\ \$4.96,\ please,\"\ said\ the\ cashier
...面倒になる可能性があります。したがって、シェルは代わりに引用符を提供します。これらには2つの主要な種類があります。
二重引用符は「グループ化引用符」と呼ばれます。ワイルドカードやエイリアスが展開されないようにしますが、ほとんどの場合、単語にスペースを含めるためのものです。パラメータやコマンドの展開(aによって通知される種類のもの$
)などの他のことはまだ起こります。そしてもちろん、二重引用符内にリテラルの二重引用符が必要な場合は、バックスラッシュする必要があります。
echo "\"Thank you. That'll be \$4.96, please,\" said the cashier"
一重引用符はより厳格です。それらの間のすべては、バックスラッシュを含め、完全に文字どおりに解釈されます。一重引用符の中にリテラル一重引用符を取得する方法は絶対にありません。
幸い、シェル内の引用符は単語の区切り文字ではありません。単独では、単語を終了しません。異なるタイプの引用符間を含め、同じ単語内で引用符を出入りして、目的の結果を得ることができます。
echo '"Thank you. That'\''ll be $4.96, please," said the cashier'
つまり、バックスラッシュははるかに少なくなりますが、閉じる単一引用符、バックスラッシュ付きリテラル単一引用符、開く単一引用符のシーケンスは、慣れるまでに時間がかかります。
最近のシェルでは、POSIX標準では指定されていない別の引用スタイルが追加されています。このスタイルでは、先頭の単一引用符の前にドル記号が付いています。このように引用された文字列は、ANSI Cプログラミング言語の文字列リテラルと同様の規則に従うため、「ANSI文字列」および$'
... '
ペア「ANSI引用符」と呼ばれることもあります。そのような文字列内では、バックスラッシュが文字どおりに使用されるという上記のアドバイスは適用されなくなります。だけでなく、あなたはそれにバックスラッシュを付加することで、リテラル単一引用符やバックスラッシュを含めることができますが、シェルはまた、のような(ANSI Cの文字エスケープを拡大-代わりに、彼らは再び特別なっ\n
改行、\t
タブのため、そして\xHH
持つ文字の16進コードHH
)。ただし、それ以外の場合は、単一引用符で囲まれた文字列として動作します。パラメーターやコマンドの置換は行われません。
echo $'"Thank you. That\'ll be $4.96, please," said the cashier'
注意すべき重要な点は、echo
コマンドへの引数として受け取った単一の文字列は、これらのすべての例でまったく同じであることです。シェルがコマンドラインの解析を完了すると、実行されているコマンドが引用された方法を知る方法がなくなります。それがしたかったとしても。
repo forall -c ' ...before... '"$variable"' ...after...'