printf表现异常

时间:2019-06-21 06:59:06

标签: linux bash printf

bash提示符下,我得到了一些令人惊讶的结果。

这是一些数据:

echo "version = blahblah" > xxx

我想这样做:

printf "%s (%s)\n" `grep '^version =' xxx` "something"

我期望是:

version = blahblah (something)

相反,我得到了:

version (=)
blahblah (something)

有人可以弄清楚为什么我要得到这个吗?

2 个答案:

答案 0 :(得分:3)

使用$(...)进行命令替换,并且必须引用它:

printf "%s (%s)\n" "$(grep '^version =' xxx)" "something"

在不引用printf的情况下,将grep命令的空格分隔输出视为printf的不同参数。

BASH FAQ: Why is $(...) preferred over backticks?

答案 1 :(得分:2)

因为格式说明符与您定义的说明符和printf看到的参数数量不匹配。与

printf "%s (%s)\n" 
#      ^^^  ^^^    

上面,该命令除了两个字符串序列后跟换行符。但是您对printf()的争论远不止于此

version = blahblah something
# (1)  (2)   (3)    (4)

因此printf()看到说明符和参数之间的不匹配,并在第二个参数=

之后插入换行符
printf '%s (%s)\n' 'version' '=' 'blahblah' 'something'

由于您的期望是将version =打印在一个字符串中,因此像anubhava's answer一样在一个字符串中生成整个grep输出,这样您的printf会将参数视为下面

printf '%s (%s)\n' 'version = blahblah' 'something'