我正在尝试使用 printf 在 bash 脚本中格式化一些漂亮的输出
例如:
-----------------------
| This is some output |
-----------------------
但我偶然发现了一些我不理解的行为。
$ printf "--"
给我错误:
printf:用法:printf [-v var] 格式[参数]
和
$ printf "-stuff"
结果是
-bash: printf: -s: 无效选项
所以显然 printf 认为我正在尝试传递一些参数,而我却没有。
与此同时,完全偶然,我发现了这个解决方法:
$ printf -- "--- this works now ----\n"
给我
--- this works now ----
谁能解释这种行为?
答案1
用于--
告诉程序接下来的任何内容都应该不是被解释为命令行选项到printf
。
因此printf "--"
你尝试的结果基本上是“printf
没有争论”因此失败了。
答案2
--
被解释为一个选项(在本例中,表示没有更多选项)。
格式字符串应该总是使用时包括在内printf
以防止错误的解释。对于您的具体情况:
printf '%s\n' '-----------------------'
答案3
printf 内置和 /usr/bin/printf 之间存在差异,第二个执行“您的意思”,而没有这些恼人的错误。
printf "-----" # error
printf -- "-----" # ok
/usr/bin/printf "-----" # ok
/usr/bin/printf -- "-----" # ok
答案4
POSIX 提供使用八进制编码的选项。
printf "--"
可以变成:
printf "\055-"
这是一种可移植的方法,可以避免--
用作格式字符串还是选项结束的标记的歧义。