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风格中也可以使用的代码.
只需使用--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,作为参数.