$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
这就是你得到两行输出的原因。
我不小心写了:
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
这就是你得到两行输出的原因。