我正在制作一个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
我知道我可以使用类似的东西来避免引号, "'uptime ; uname -a'"但是我不能保证用户会这样做。
"'uptime ; uname -a'"
在将参数传递到脚本之前,引号已被删除,因此保留它们为时已晚。您可以做的是在将参数传递给内部命令时保留其效果,并重建等效的带引号/转义版本的参数以进行打印。
为了将参数传递给内部命令"$@"-使用双引号,$ @保留原始的换行符,这意味着内部命令接收的脚本列表与脚本完全相同。
"$@"
对于打印,可以在bash的printf命令中使用%q格式来重建报价。请注意,这并不总是重建原始的引用,而是会构造一个 等效的带 引号/转义的字符串。例如,如果您传递了参数,则该参数'uptime ; uname -a'可能会打印uptime\ \;\ uname\ -a或"uptime ; uname -a"其他等效参数(有关类似示例,请参见@William Pursell的答案)。
'uptime ; uname -a'
uptime\ \;\ uname\ -a
"uptime ; uname -a"
这是使用这些的示例:
printf "Running command:" printf " %q" innercmd "$@" # note the space before %q -- this inserts spaces between arguments printf "\n" innercmd "$@"