配列の形で与えられたコマンドを文字列化したいと思います。
たとえば、これはコマンドを挿入するときに便利ですbash -c
。
たとえば、
cmd=(
"printf '%s\n'"
"foo bar"
"baz bang"
)
stringified="$(transform "${cmd[@]}")"
これにより、"${cmd[@]}"
すべてのbash -c "$stringified"
cmd配列に対してまったく同じ出力が得られます。
私の場合は、次のようになります。
$ "${cmd[@]}"
foo bar
baz bang
私の場合、値はうまくstringified="printf \"%s\n\" \"foo bar\" \"baz bang\""
いきますが、これらのパラメータを適切にエスケープするための変換関数があると思います。
私はbashソリューションを好み、そうでない場合は通常、Linuxディストリビューションにすでにインストールされているツール(printf、echo)を使用することを好みます。
ベストアンサー1
その機能を使用する良い解決策(すべての入力配列に対して機能すると思う)を見つけましたprintf "%q"
。
次のように書くことができます。
cmd=(
"printf '%s\n'"
"foo bar"
"baz bang"
)
stringified="$(printf "%q " "${cmd[@]}")"
これは以下を提供します:
printf\ \'%s\\n\' foo\ bar baz\ bang
説明する
printf "%q"コマンドは、シェルで使用するために文字をエスケープします。
%q引数印刷できない文字をエスケープするために推奨されるPOSIX $ ''構文を使用して、シェル入力として再利用可能な形式で印刷します。
ソース: man printf
を使用すると、"%q "
配列内のすべての要素が正しく印刷され、エスケープされ、後にスペースがあるため、すべての要素%q
がスペースで区切られます。