printf 命令通配符解释

printf 命令通配符解释

我想知道printf使用通配符时命令会遵循什么行为。这个问题最初是由其他人问我的,但我自己对这种行为感到困惑,并希望得到一个解释来帮助我理解命令的printf工作原理。

给定以下目录:

$ ls -a  
.a  a.b  ab.c  b  .b  b.a  b.c  c  c.d  d  d.e  e

$ printf [abcd]*[abcd]将输出a.b$ ls [abcd]*[abcd]给出

a.b:    

ab.c:    

b.a:      

b.c:      

c.d:   
    

作为输出,$ echo [abcd]*[abcd]结果为a.b ab.c b.a b.c c.d

为什么 printf 的输出不同?这与正则表达式/shell 扩展优先级有关吗?

答案1

使用set -x来查看 shell 展开后的命令到底是什么。结果

printf [abcd]*[abcd]

在你的目录中实际上是

printf a.b ab.c b.a b.c c.d

现在printf视为a.b格式(见man 1 printf)。它不包含%s任何类似的东西,这就是为什么其余的参数并不重要并且文字a.b被打印。

如果您希望printf表现得更像echo,您应该指定所需的格式,例如:

printf '%s\n' [abcd]*[abcd]

将打印

a.b
ab.c
b.a
b.c
c.d

(注意:测试完成后用于set +x恢复。)set -x

相关内容