我正在尝试用 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.
答案2
以 0 开头是八进制表示法的惯例,就像以 0x 开头是十六进制表示法一样。因此 024 的解释是 2*8+4 == 20。查看命令的输出:
echo $(( 024 ))
使用下面评论中@steeldriver 代码中的代码示例去掉前导零。