如何在打印bash脚本的参数时保留引号

如何在打印bash脚本的参数时保留引号

本文介绍了如何在打印bash脚本的参数时保留引号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个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'"这样的东西来转义引号,但我不能保证用户会这样做。

推荐答案

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

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

对于打印,您可以在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 "
"
innercmd "$@"
如果您有bash版本4.4或更高版本,您可以在参数展开上使用@Q修饰符来添加引号。这倾向于使用单引号(与printf %q首选的转义相反)。您可以将其与$*结合使用以获得合理的结果:

echo "Running command: innercmd ${*@Q}"
innercmd "$@"

请注意,$*将所有参数混合到一个字符串中,并在它们之间留有空格,这通常没有什么用处,但在本例中,每个参数都是单独引号的,因此结果实际上(可能)就是您想要的结果。(除非您更改了IFS,在这种情况下,参数之间的&q;空格&q;将是$IFS的第一个字符,可能不是。)

这篇关于如何在打印bash脚本的参数时保留引号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 17:31