为了使我的代码可移植,我尝试使用printf
而不是echo
。但是接下来
printf "-dogs-cats"
返回错误。本案的解决方法是:
printf "-";printf "dogs-cats"
但是有一个通用的,可移植的命令(或带有printf
的选项)会以文字/逐字打印任意字符串,而不是尝试将字符串解释为格式吗?
我在BSD UNIX(在Mac上)工作,但我的目标是在其他UNIX版本中也可以使用的代码。
答案 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"