我有网线
let "b64 = 64#@_" # the result is 4011
echo "b64 = $b64" # is 4011
我们是如何得到这个结果的。 有谁知道基础符号是什么以及我们如何得到这个结果?我在哪里可以读到这个符号?
答案 0 :(得分:5)
根据算术扩展第三段中的man bash
:
如果省略base#,则使用基数10。指定n时,大于9的数字按小时字母,大写字母,@和_表示。如果base小于或等于36,则可以互换使用小写和大写字母来表示10到35之间的数字。
字母表中只有62位数字a-z + A-Z + 0-9。还需要两个。所以@和_只是数字的基数64表示中的数字。
$ echo "$(( 64#@ ))"
62
$ echo "$(( 64#_ ))"
63
$ echo "$(( 64#@@ ))"
4030
$ echo "$(( 64#@_ ))"
4031
我无法解释“4011”的结果。我相信这只是你问题上的一个错字。
答案 1 :(得分:4)
如果您输入help let
,bash会告诉您let
命令。它告诉bash将每个参数计算为算术表达式。
The bash reference manual解释了64#@_
的含义:
前导0的常量被解释为八进制数。前导“
0x
”或“0X
”表示十六进制。否则,数字采用 [base#] n 的形式,其中可选的 base 是2到64之间的十进制数,表示算术基数, n 是该基数中的数字。如果省略 base#,则使用基数10。指定 n 时,大于9的数字按小时字母,大写字母“@
”和“_
”按顺序表示。如果base小于或等于36,则可以互换使用小写和大写字母来表示10到35之间的数字。
因此,您的命令会为名为b64
的变量分配一个数值。数值以base 64给出。在bash的base 64中,@
是值为62的数字,_
是值为63的数字,因此总值为62×64 1 + 63×64 0 = 4031。
(注意你错误地说结果是4011.我用bash版本4.2.48(1)测试 - 发布并得到4031.)