【问题标题】:What does printf do? It is making weird output and I don't understand why [duplicate]printf 是做什么的?它产生奇怪的输出,我不明白为什么[重复]
【发布时间】:2018-07-19 10:10:31
【问题描述】:

在我的 Mac High Sierra 的终端中使用 Bash。

所以这个代码应该确保一个三位数的数字。我用 printf 做到了这一点。我创建了 bash 文件。这将接受一个数字,然后将其转换为三位数并打印。但它做了一些奇怪的事情,我想知道为什么。

如果您输入正常的数字 1、2、3,... 一切正常。 如果您输入三位数字 001 ... 007 一切正常。

例子:

  • 输入 1 输出 001。
  • 输入 04 输出 004。
  • 输入 005 输出 005。

到目前为止一切顺利。

这就是奇怪的地方。

  • 如果我输入 008,那么它会输出 000。
  • 如果我输入 009,那么它会输出 000。
  • 如果我输入 010,那么它会输出 008。
  • 如果我输入 019,那么它会输出 000。
  • 如果我输入 030,那么它会输出 024。
number=$1
digit=$(printf "%03d" $number)
echo num: $number
echo digit: $digit

【问题讨论】:

  • number=$(( 10#$1 )) 强制解释为十进制
  • 指定使用十进制::digit=$(printf "%03d" "10#$number")
  • 运行printf -v digit "%03d" "10#$number" 效率更高——没有子shell。 digit=$(printf ...) 中的子shell 在(真正的 David Korn)ksh 中进行了优化,但不是 bash。

标签: bash printf octal


【解决方案1】:

当您输入带有前导 0 的数字时,它会将其视为八进制(即基数 8)数字(因此 010 -> 8 十进制)。它将以十进制打印,并且您的格式 arg 表示打印宽度为 3(因此它打印 008)。

009 打印000 的原因是因为9 不是八进制数字(只有0-7),所以数字只是被忽略,所以它打印0 宽度为3(@ 987654330@)。

【讨论】:

  • 你这么多。
猜你喜欢
  • 2013-04-06
  • 2017-01-03
  • 2023-01-02
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2021-05-06
  • 2022-12-14
  • 2020-04-20
相关资源
最近更新 更多