5

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

printf "-dogs-cats"

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

printf "-";printf "dogs-cats"

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

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

4

2 回答 2

7

使用格式规范:

printf '%s' "-dogs-cats"
于 2016-11-04T13:11:05.540 回答
6

只需使用--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为参数。

于 2016-11-04T13:00:31.100 回答