一尘不染

在bash参数中保留引号

linux

我正在制作一个bash脚本,该脚本将打印并将复杂的参数传递给另一个外部程序。

./script -m root@hostname,root@hostname -o -q -- 'uptime ; uname -a'

我该如何打印原始参数:

-m root@hostname,root@hostname -o -q -- 'uptime ; uname -a'

使用$@$*删除uptime ; uname -a可能引起不良结果的单引号。我的脚本不需要解析每个参数。我只需要打印/记录参数字符串,然后将其确切地传递给另一个程序。

我知道我可以使用类似的东西来避免引号, "'uptime ; uname -a'"但是我不能保证用户会这样做。


阅读 546

收藏
2020-06-02

共1个答案

一尘不染

在将参数传递到脚本之前,引号已被删除,因此保留它们为时已晚。您可以做的是在将参数传递给内部命令时保留其效果,并重建等效的带引号/转义版本的参数以进行打印。

为了将参数传递给内部命令"$@"-使用双引号,$ @保留原始的换行符,这意味着内部命令接收的脚本列表与脚本完全相同。

对于打印,可以在bash的printf命令中使用%q格式来重建报价。请注意,这并不总是重建原始的引用,而是会构造一个 等效的带
引号/转义的字符串。例如,如果您传递了参数,则该参数'uptime ; uname -a'可能会打印uptime\ \;\ uname\ -a"uptime ; uname -a"其他等效参数(有关类似示例,请参见@William Pursell的答案)。

这是使用这些的示例:

printf "Running command:"
printf " %q" innercmd "$@" # note the space before %q -- this inserts spaces between arguments
printf "\n"
innercmd "$@"
2020-06-02