在printf中的破折号


37

我正在尝试使用printf在bash脚本中格式化一些漂亮的输出

例如:
-----------------------
| This is some output |
-----------------------

但是我偶然发现了一些我不了解的行为。

$ printf "--" 给我错误 printf: usage: printf [-v var] format [arguments]

$ printf "-stuff"导致-bash: printf: -s: invalid option

因此,显然printf认为我正在尝试传递一些参数,而我却没有。

同时,完全出于偶然,我发现了以下解决方法:
$ printf -- "--- this works now ----\n"给我--- this works now ----

谁能解释这种行为?



出于兴趣,是否有任何实现echo会在执行时失败echo ------------?大多数只支持-n(没有尾随换行符),-e(解释反斜杠转义的字符)并且可能-E(不解释它们)并且在遇到其他类似选项的参数时也不会出错,对吗?(编辑:GNU /bin/echo也支持--help--version。)
janmoesen 2011年

Answers:


44

--是用来告诉程序,无论下面应该没有被解释为命令行选项printf

编辑:因此,printf "--"您尝试的结果基本上是“没有参数的printf”,因此失败了。


18
换句话说,要打印--,可以运行printf -- --
l0b0 2011年

2
...并且printf --printf(您收到相同的消息)相同
Peter.O 2011年

25

-- 被解释为选项(在这种情况下,表示没有更多选项)。

使用时应始终包含格式字符串,printf以防止错误解释。对于您的特定情况:

printf '%s\n' '-----------------------'

何时需要按顺序执行该操作呢?printf '-%.0s' {1..54}
qodeninja

2
@qodeninja然后,您实际上确实想使用--:-)printf -- '-%.0s' {1..54}
克里斯·

4

内置的printf和/ usr / bin / printf之间有区别,第二个则执行“您的意思”,而没有这些烦人的错误。

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.