bash printf文字逐字字符串

Jac*_*lin 3 unix bash printf bsd verbatim

为了使我的代码可移植,我尝试使用printf而不是echo.但是之后

printf "-dogs-cats" 
Run Code Online (Sandbox Code Playgroud)

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

printf "-";printf "dogs-cats"
Run Code Online (Sandbox Code Playgroud)

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

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

che*_*ner 7

使用格式规范:

printf '%s' "-dogs-cats"
Run Code Online (Sandbox Code Playgroud)


fed*_*qui 6

只需使用--after就printf可以让它知道不再有任何参数来考虑字符串:

$ printf -- "-dogs-cats" 
-dogs-cats                    # no new line after this
Run Code Online (Sandbox Code Playgroud)

这是一个*NIX技巧,可以用于许多其他命令.正如Bash参考手册→4 Shell Builtin命令所说:

除非另有说明,否则每个内置命令都记录为接受以' - ' 开头的选项,接受' - '表示选项的结束.:,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]
Run Code Online (Sandbox Code Playgroud)

这使得printf理解字符串的第一部分-d,作为参数.

  • 或者,使用格式规范:`printf"%s"" - dogs-cats"` (2认同)