bash printf文字逐字字符串

时间:2016-11-04 12:53:54

标签: bash unix printf bsd verbatim

为了使我的代码可移植,我尝试使用printf而不是echo。但是接下来

printf "-dogs-cats" 

返回错误。本案的解决方法是:

printf "-";printf "dogs-cats"

但是有一个通用的,可移植的命令(或带有printf的选项)会以文字/逐字打印任意字符串,而不是尝试将字符串解释为格式吗?

我在BSD UNIX(在Mac上)工作,但我的目标是在其他UNIX版本中也可以使用的代码。

2 个答案:

答案 0 :(得分:6)

只需在--之后使用printf让它知道不再有参数,并将字符串视为:

$ printf -- "-dogs-cats" 
-dogs-cats                    # no new line after this

这是一个* NIX技巧,可以用于许多其他命令。正如Bash Reference Manual → 4 Shell Builtin Commands所说:

  

除非另有说明,每个内置命令都记录作为接受选项,前面加上“ - ”接受' - '表示选项的结尾。 :,true,false和test builtins不接受选项,也不特别对待' - '。 exit,logout,return,break,continue,let和shift builtins接受并处理以' - '开头的参数,而不需要' - '。其他接受参数但未指定为接受选项的内置函数将以“ - ”开头的参数解释为无效选项,并且需要“ - ”来阻止此解释。

请注意为什么会发生这种情况:

$ printf "-dogs-cats" 
bash: printf: -d: invalid option
printf: usage: printf [-v var] format [arguments]

这使得printf将字符串的第一部分-d理解为参数。

答案 1 :(得分:4)

使用格式规范:

printf '%s' "-dogs-cats"