説明する

説明する

配列の形で与えられたコマンドを文字列化したいと思います。

たとえば、これはコマンドを挿入するときに便利です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がスペースで区切られます。

おすすめ記事