$d 在 printf 中做什么?

What does $d do in printf?

我不小心写了:

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

并得到:

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

为什么?

我当然是想说%d,但我不理解我犯的错误中的这种行为。我可能希望它打印 "here: /home/gsamaras/Bash/libs/goodLib $d",就像 do in C 一样...我找不到重复项或其他内容,因此出现了问题。

在将字符串 "here: %s $d\n" 传递给 printf 之前,参数扩展由 shell 执行。在这种情况下 $d 被扩展为一个空字符串。

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

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

The format is reused as necessary to consume all of the arguments.

(来自 printf 部分的 man bash)。

第一步,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

这就是你得到两行输出的原因。