Bash 脚本:365-024=345?

Bash 脚本:365-024=345?

我正在尝试用 bash 构建一些初学者脚本。我想使用 date 程序找出从今天到年底还剩多少天。

所以我使用了一个变量,当前日期=$(日期+%j)获取当前日期的数字。

如果我 回声 $当前日期我得到的结果是024,因为今天是 1 月 24 日,所以这是意料之中的事。

所以365-024还剩多少天?我的疑问来了。计算一下,假设计算 365-024我得到了345,而不是 341

怎么了?这与前面的零有关(024)不是吗?

答案1

怎么了?这跟前面的零(024)有关系吧?

是的。前导0表示该数字被解释为八进制(以 8 为基数)数。

  • 八进制 024 == 十进制 20。

要将数字解释为十进制数,请使用:

$ echo $((024))
20

有关详细信息,请参阅 如何抑制 bash 八进制数解释?(解释为十进制)它专门解决了使用 进行计算时的这个问题date


数值常数

除非数字具有特殊的前缀或符号,否则 Shell 脚本会将数字解释为十进制(基数 10)。

  • 前面带有 0 的数字是八进制(基数为 8)。
  • 以 0x 开头的数字是十六进制(基数为 16)。
  • 带有嵌入 # 的数字将被计算为 BASE#NUMBER(具有范围和符号限制)。

数值常数的表示

#!/bin/bash
# numbers.sh: Representation of numbers in different bases.

# Decimal: the default
let "dec = 32"
echo "decimal number = $dec"             # 32
# Nothing out of the ordinary here.


# Octal: numbers preceded by '0' (zero)
let "oct = 032"
echo "octal number = $oct"               # 26
# Expresses result in decimal.
# --------- ------ -- -------


# Hexadecimal: numbers preceded by '0x' or '0X'
let "hex = 0x32"
echo "hexadecimal number = $hex"         # 50

echo $((0x9abc))                         # 39612
#     ^^      ^^   double-parentheses arithmetic expansion/evaluation
# Expresses result in decimal.



# Other bases: BASE#NUMBER
# BASE between 2 and 64.
# NUMBER must use symbols within the BASE range, see below.


let "bin = 2#111100111001101"
echo "binary number = $bin"              # 31181

let "b32 = 32#77"
echo "base-32 number = $b32"             # 231

let "b64 = 64#@_"
echo "base-64 number = $b64"             # 4031
# This notation only works for a limited range (2 - 64) of ASCII characters.
# 10 digits + 26 lowercase characters + 26 uppercase characters + @ + _


echo

echo $((36#zz)) $((2#10101010)) $((16#AF16)) $((53#1aA))
                                         # 1295 170 44822 3375


#  Important note:
#  --------------
#  Using a digit out of range of the specified base notation
#+ gives an error message.

let "bad_oct = 081"
# (Partial) error message output:
#  bad_oct = 081: value too great for base (error token is "081")
#              Octal numbers use only digits in the range 0 - 7.

exit $?   # Exit value = 1 (error)

# Thanks, Rich Bartell and Stephane Chazelas, for clarification.

来源高级 Bash 脚本指南 - 数值常量

答案2

以 0 开头是八进制表示法的惯例,就像以 0x 开头是十六进制表示法一样。因此 024 的解释是 2*8+4 == 20。查看命令的输出:

echo $(( 024 ))

使用下面评论中@steeldriver 代码中的代码示例去掉前导零。

相关内容