Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux printf的行为出人意料_Linux_Bash_Printf - Fatal编程技术网

Linux printf的行为出人意料

Linux printf的行为出人意料,linux,bash,printf,Linux,Bash,Printf,我在bash提示符下得到了一些令人惊讶的结果 以下是一些数据: echo "version = blahblah" > xxx 我想这样做: printf "%s (%s)\n" `grep '^version =' xxx` "something" 我期望是: version = blahblah (something) 相反,我得到: version (=) blahblah (something) 有人能解释一下我为什么会这样做吗?使用$(…)进行命令替换,您必须引用它: p

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

以下是一些数据:

echo "version = blahblah" > xxx
我想这样做:

printf "%s (%s)\n" `grep '^version =' xxx` "something"
我期望是:

version = blahblah (something)
相反,我得到:

version (=)
blahblah (something)
有人能解释一下我为什么会这样做吗?

使用
$(…)
进行命令替换,您必须引用它:

printf "%s (%s)\n" "$(grep '^version =' xxx)" "something"
不引用
printf
grep
命令中以空格分隔的输出视为
printf
的不同参数

使用
$(…)
替换命令,您必须引用它:

printf "%s (%s)\n" "$(grep '^version =' xxx)" "something"
不引用
printf
grep
命令中以空格分隔的输出视为
printf
的不同参数


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

printf "%s (%s)\n" 
#      ^^^  ^^^    
如上所述,该命令将两个字符串序列后跟一个新行字符。但是您对
printf()
的参数不止这些

version = blahblah something
# (1)  (2)   (3)    (4)
因此
printf()
看到了说明符和参数之间的这种不匹配,并在第二个参数后面插入了换行符,即
=

printf '%s (%s)\n' 'version' '=' 'blahblah' 'something'
由于您希望在一个字符串中打印
version=
,因此在一个字符串中生成整个
grep
输出,就像您的
printf
看到的参数一样,如下所示

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

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

printf "%s (%s)\n" 
#      ^^^  ^^^    
如上所述,该命令将两个字符串序列后跟一个新行字符。但是您对
printf()
的参数不止这些

version = blahblah something
# (1)  (2)   (3)    (4)
因此
printf()
看到了说明符和参数之间的这种不匹配,并在第二个参数后面插入了换行符,即
=

printf '%s (%s)\n' 'version' '=' 'blahblah' 'something'
由于您希望在一个字符串中打印
version=
,因此在一个字符串中生成整个
grep
输出,就像您的
printf
看到的参数一样,如下所示

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

虽然使用
$(..)
是正确的,但这本身并不是问题所在guess@Inian不,这不是问题所在。您还必须按照说明引用它。:)实际上并不需要
$(…)
,倒勾也可以。报价是关键。好的,很高兴知道。这样做的理由是什么?虽然使用
$(..)
是正确的,但这本身并不是问题所在guess@Inian不,这不是问题所在。您还必须按照说明引用它。:)实际上并不需要
$(…)
,倒勾也可以。报价是关键。好的,很高兴知道。这是什么理由?好的,明白了。我的印象是backtick隐含地将结果放入单个argument@volingas不。如果使用的命令替换(或变量引用)周围没有双引号,shell将尝试将其拆分为“单词”(此处发生的情况),并尝试将包含通配符的任何单词扩展为匹配文件名列表。通常你不想要这些,所以你应该在这些东西周围加上双引号。好的,明白了。我的印象是backtick隐含地将结果放入单个argument@volingas不。如果使用的命令替换(或变量引用)周围没有双引号,shell将尝试将其拆分为“单词”(此处发生的情况),并尝试将包含通配符的任何单词扩展为匹配文件名列表。通常你不想要这些,所以你应该在这些东西周围加上双引号。