在bash中使用printf转义连字符(--)

Len*_*and 6 bash

我有以下几行:

printf "---- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)

当我在 bash 下运行它时,出现以下错误:

printf: --: 无效选项 printf: 用法: printf [-v var] 格式 [参数]

这是因为(我认为) printf 将字符串“----”解释为参数的开头。我试图使用“\”来逃避这个,就像这样:

printf "\---- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)

结果如下:

\---- content of $1 -------

如您所见,“\”成为输出的一部分,这不是我想要的。

所以问题是,我怎样才能说服 printf 我不想传递一个长论点

小智 7

为避免将参数开始-解释为选项,您有几种不同的选择:

1) 将格式字符串的减号移动到参数字符串,可能反映%.s格式说明符中打印字符串的新长度。如:

$ printf "%.60s\n" "---- $1 --------------"
Run Code Online (Sandbox Code Playgroud)

2)bash的内置命令接受--作为一个选项,指示它们停止处理选项并将后面的所有内容视为文件名和参数。如:

$ printf -- "---- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)

3)您可以用八进制代码替换减号。实际上,只替换第一个是有效的,如下所示:

$ printf "\055--- %.55s\n" "$1 --------------"
Run Code Online (Sandbox Code Playgroud)