gsa*_*ras 3 string bash printf format-specifiers
我不小心写道:
printf "here: %s $d\n" "${line:0:32}" "${#line}"
Run Code Online (Sandbox Code Playgroud)
得到了:
here: /home/gsamaras/Bash/libs/goodLib
here: 103
Run Code Online (Sandbox Code Playgroud)
为什么?
我当然想说%d,但我不理解我犯的错误中的这种行为.我可能希望它打印"here:/ home/gsamaras/Bash/libs/goodLib $ d",就像它do in C...我找不到重复或其他东西,因此问题.
在"here: %s $d\n"传递字符串之前printf,参数扩展由shell执行.在这种情况下$d,扩展为空字符串.
如果你在字符串周围使用单引号,或者使用反斜杠转义$,那么你会$d在输出中看到.
由于string(%s)中只有一个格式说明符,并且在格式字符串后面传递了两个参数,因此最终得到两行输出:
必要时重用该格式以使用所有参数.
(来自man bash本printf节).
第一步,shell执行可变扩展.由于没有变量$d,因此将其替换为空字符串.在变量替换后,就像你写的那样:
printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib 103
Run Code Online (Sandbox Code Playgroud)
现在为什么要打印here:两次?当printf给出比格式说明符更多的参数时,它会重复格式字符串,循环额外的时间,直到它消耗掉所有参数.由于你只有一个%s但有两个额外的参数,它会循环两次.就像你写的那样:
printf 'here: %s \n' /home/gsamaras/Bash/libs/goodLib
printf 'here: %s \n' 103
Run Code Online (Sandbox Code Playgroud)
这就是为什么你得到两行输出.