文字列を変数に格納することについての@gniourf_gniourfの最初のコメントは、基本的に正しいと思います(コマンド引数を格納しようとしているだけですが)。BashFAQ#050を参照してください:コマンドを変数に入れようとしていますが、複雑なケースは常に失敗します!。
ここで、2つの混乱があります。1つ目は、どの-x
モードが印刷されているかを誤解していることです。実行しているコマンドの引数は出力されません。同じ引数を渡すコマンドが出力されます。この場合、一部の引数には一重引用符が含まれているため、引用符とエスケープされた文字列が返され、引用符を削除すると、実際に渡されるのと同じ引数になります。たとえば、引数の1つは。'af
であるため、-xモードではそれが。として表示され$'\'af'
ます。
次に、変数に一重引用符を埋め込もうとしているようです。これにより、複数の単語を単一の引数としてfunctionTestに渡すことができます(つまり、functionTest -CMD 'af -i 3 -a'). If I'm right about what you're trying to do, you're doing it fundamentally wrong. When the shell parses a command line, it interprets quotes and escapes, *then* substitutes variables. It'll go back and split the replaced variables into words, but it will not go back and pay attention to quotes and escapes in the substituted text. So when it replaces
$ buff with
-CMD'af-iと同等のものを実行しようとしています。 3 -a'`は、これを5つの引数「-CMD」、「af」、「-i」、「3」、および「-a」に分割します。一重引用符は、 2番目と5番目の引数。単一の長い引数を囲むものではありません。
$ buff="-CMD 'af -i 3 -a'"
$ printargs $buff
Got 5 arguments:
«-CMD»
«'af»
«-i»
«3»
«-a'»
この種の混乱なしに複数の引数を格納するには、配列を使用する必要があります(ここでも、@ gniourf_gniourfのコメントとBashFAQ#050を参照してください)。
$ buff=(-CMD 'af -i 3 -a')
$ printargs "${buff[@]}"
Got 2 arguments:
«-CMD»
«af -i 3 -a»
ところで、これを複製しようとしている場合は、printargsが必要になります。これは、次のような状況を明確にするために作成した非常に単純なシェルスクリプトです。
#!/bin/sh
echo "Got $# arguments:"
for arg; do
echo " «${arg}»"
done