有没有办法逐字 printf $@ ?

有没有办法逐字 printf $@ ?

我想编写一个逐字回显的脚本stdout$@包括任何潜在的双引号,没有换行符。

我尝试过的:

> cat ./script1    
#! /usr/bin/bash
printf "%s %s" $0 $@
echo -n $0 $@
echo -n "$0 $@"
> 
> ./script1 a "bc d"
./script1 abc d./script1 a bc d./script1 a bc d>

我希望我的脚本运行如下:

> ./script1 a "bc d"
./script1 a "bc d">

有没有办法做到这一点?

答案1

您的位置参数在示例中不包含任何双引号:

./script1 a "bc d"

双引号只是告诉 shell 不应在bc和之间的空格上执行分词d

如果您希望第二个参数包含文字引号,则需要对它们进行转义以告诉 shell 它们是文字:

./script1 a '"bc d"'

或者

./script1 a \"bc\ d\"

您可以使用printf可重用为 shell 输入(转义)的格式来打印它们:

$ set -- a "bc d"
$ printf '%q\n' "$@"
a
bc\ d

正如你所看到的,这只是逃离了空间。

答案2

正如其他地方所解释的,您键入的双引号向 shell 指示所包含的文本将被视为单个单词。如果你想打印出引号括起来的单词,那是相当简单的;您只需将它们包含在输出的文本中:

#!/bin/bash
printf '"%s" ' "$@"
printf "\n"

请注意,这将为每个参数添加双引号,而不仅仅是那些在运行命令时可能包含双引号的参数。

相关内容