$ d在printf中做什么?

时间:2018-12-13 14:29:59

标签: string bash printf format-specifiers

我不小心写了:

printf "here: %s $d\n" "${line:0:32}" "${#line}"

并得到:

here: /home/gsamaras/Bash/libs/goodLib 
here: 103 

为什么?

我当然想说%d,但由于我所犯的错误,我不理解这种行为。我可能希望它打印“此处:/ home / gsamaras / Bash / libs / goodLib $ d”,就像它会 do in C 一样...我找不到重复的或在那上面的东西,就是问题。

2 个答案:

答案 0 :(得分:6)

在将字符串.toString()传递到"here: %s $d\n"之前,shell将执行参数扩展。在这种情况下,printf将扩展为空字符串。

如果您在字符串周围使用单引号或对$d进行反斜杠转义,那么您将在输出中看到$

由于您的字符串($d)中只有一个格式说明符,并且在格式字符串之后传递了两个参数,因此最终得到两行输出:

  

必要时可以重新使用该格式以消耗所有参数。

(来自%s部分的man bash)。

答案 1 :(得分:5)

第一步,shell执行变量扩展。由于没有变量$d,因此将其替换为空字符串。替换变量后,就好像您写了一样:

printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib 103

现在为什么打印两次here:?当给printf提供的参数多于格式说明符时,它将重复格式字符串,循环额外的时间,直到消耗完其所有参数。由于您只有一个%s但有两个额外的参数,因此它将循环两次。就像您写过一样:

printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib
printf 'here: %s \n' 103

这就是为什么要获得两行输出的原因。