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