【问题标题】:What does $d do in printf?$d 在 printf 中做了什么?
【发布时间】:2018-12-13 14:29:59
【问题描述】:

我不小心写了:

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... 我找不到重复的东西或其他东西那就是问题所在。

【问题讨论】:

  • @Biffen 我喜欢在 C 和 C++ 中使用双引号和带有单引号范式的字符串,但我明白你的意思,谢谢你的提示! RockyLi,我明白了,但仍然不清楚为什么我会两次“在这里”......
  • @gsamaras 这个就不拖了,但是C和Bash是不同的语言,单引号和双引号在两者中分别代表不同的含义。我一般不建议在这样的语言之间迁移范式。

标签: string bash printf format-specifiers


【解决方案1】:

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

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

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

根据需要重用该格式以使用所有参数。

(来自printf 部分中的man bash)。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      相关资源
      最近更新 更多