为了使我的代码可移植,我尝试使用printf
而不是echo
. 但是之后
printf "-dogs-cats"
返回错误。本案例中的解决方法是:
printf "-";printf "dogs-cats"
但是是否有一个通用的、可移植的命令(或带有 的选项printf
)将任意字符串打印为文字/逐字,而不是尝试将字符串解释为格式?
我在BSD Unix(在 Mac 上)工作,但我的目标是代码也可以在其他 Unix 风格中工作。
使用格式规范:
printf '%s' "-dogs-cats"
只需使用--
afterprintf
让它知道没有更多的参数来了,并认为字符串是这样的:
$ printf -- "-dogs-cats"
-dogs-cats # no new line after this
这是一个*NIX 技巧,可用于许多其他命令。正如Bash Reference Manual → 4 Shell Builtin Commands所说:
除非另有说明,否则记录为接受以“-”开头的选项的每个内置命令都接受“--”以表示选项的结束。:、true、false 和 test 内置命令不接受选项,也不特别对待 '--'。exit、logout、return、break、continue、let 和 shift 内置函数接受并处理以“-”开头的参数,而不需要“--”。其他接受参数但未指定为接受选项的内置函数将以“-”开头的参数解释为无效选项,并需要“--”来防止这种解释。
注意为什么会发生这种情况:
$ printf "-dogs-cats"
bash: printf: -d: invalid option
printf: usage: printf [-v var] format [arguments]
这使得printf
将字符串的第一部分 , 理解-d
为参数。