printf 中的破折号

printf 中的破折号

我正在尝试使用 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-"

这是一种可移植的方法,可以避免--用作格式字符串还是选项结束的标记的歧义。

相关内容