printf 中的破折号

Ken*_*ert 58 bash printf

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

例如:

-----------------------  
| This is some output | 
-----------------------
Run Code Online (Sandbox Code Playgroud)

但我偶然发现了一些我不明白的行为。

$ printf "--"
Run Code Online (Sandbox Code Playgroud)

给我错误:

printf: 用法: printf [-v var] 格式 [参数]

$ printf "-stuff"
Run Code Online (Sandbox Code Playgroud)

结果是

-bash: printf: -s: 无效选项

所以显然 printf 认为我试图传递一些参数,而我不是。

同时,完全出于偶然,我找到了这个解决方法:

-----------------------  
| This is some output | 
-----------------------
Run Code Online (Sandbox Code Playgroud)

给我

--- this works now ----
Run Code Online (Sandbox Code Playgroud)

谁能解释这种行为?

sr_*_*sr_ 64

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

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

  • 换句话说,要打印 `--`,你可以运行 `printf -- --`。 (26认同)
  • 请注意,`printf -- $fmt` 不可移植。在 busybox 1.30.1 上,`printf -- '%s\n' hello` 产生 `--`。另见:https://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html (3认同)
  • ...并且 `printf --` 与 `printf` 相同(你得到相同的消息) (2认同)
  • @AlexanderShukaev 我的错,我在 LineageOS 上测试了它,现在我看到它在 `adb shell` 中使用 `mksh` 而不是 busybox。它与 `busybox printf -- '%s\n' hello` 一起正常工作。不过,关于可移植性的观点仍然存在。 (2认同)

Chr*_*own 37

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

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

printf '%s\n' '-----------------------'
Run Code Online (Sandbox Code Playgroud)

  • @qodeninja 那么你实际上*确实*想要使用`--` :-) `printf -- '-%.0s' {1..54}` (5认同)

小智 9

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

printf "-----"             # error
printf -- "-----"          # ok
/usr/bin/printf "-----"    # ok
/usr/bin/printf -- "-----" # ok
Run Code Online (Sandbox Code Playgroud)