我想对给定的命令进行字符串化,以数组的形式给出。
例如,这对于将命令放入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
,所以所有元素都将由空格分隔。