我想编写一个逐字回显的脚本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"
请注意,这将为每个参数添加双引号,而不仅仅是那些在运行命令时可能包含双引号的参数。