Bash printf的文字直接量字符串

6
为了使我的代码具有可移植性,我尝试使用printf而不是echo。但是。
printf "-dogs-cats"

返回一个错误。在目前的情况下,解决方法是:

printf "-";printf "dogs-cats"

但是否有一般的、可移植的命令(或者在printf中的选项),可以将任意字符串作为文字/原样打印,而不是尝试将该字符串解释为格式?

我在BSD Unix(在Mac上)工作,但我的目标是编写可以在其他Unix版本中运行的代码。

2个回答

11

使用格式规范:

printf '%s' "-dogs-cats"

我最喜欢这个答案,因为它适用于那些可能想要在不被 shell 解释的情况下使用的疯狂控制序列。 - Demitri

6

只需在printf后面使用--,让它知道没有更多的参数,并将字符串视为如下:

$ printf -- "-dogs-cats" 
-dogs-cats                    # no new line after this

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

除非另有说明,否则每个内置命令文档都接受以“-”开头的选项‘--’表示选项结束。 :,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作为一个参数。

1
正准备将此作为答案发布:D可能还要指出printf默认不会添加换行符 - Sundeep
2
或者,使用格式规范:printf "%s" "-dogs-cats" - glenn jackman
这并非所有情况下都适用 - 尝试执行 printf -- "/var/log/celery/%n%I.log" - 你会得到 'I': invalid format character。我结合了您的回答和@chepner的回答,使用了%s,那样就行了。 - Almenon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接