我不小心写了:
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 一样...我找不到重复的或在那上面的东西,就是问题。
答案 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
这就是为什么要获得两行输出的原因。