$ d在printf中做了什么?

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...我找不到重复或其他东西,因此问题.

Tom*_*ech 6

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

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

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

必要时重用该格式以使用所有参数.

(来自man bashprintf节).


Joh*_*ica 5

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

这就是为什么你得到两行输出.