解释

解释

我想对给定的命令进行字符串化,以数组的形式给出。

例如,这对于将命令放入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" 命令转义要在 shell 中使用的字符:

%q ARGUMENT 以可重复用作 shell 输入的格式打印,使用建议的 POSIX $'' 语法转义不可打印的字符。

来源: man printf

通过使用"%q ",数组中的所有元素都会被打印并正确转义,并且由于 后有一个空格%q,所以所有元素都将由空格分隔。

相关内容