什么是bash var = 64#@ _

时间:2016-11-30 17:14:42

标签: bash

我有网线

let "b64 = 64#@_" # the result is 4011    
echo "b64 = $b64" # is 4011    

我们是如何得到这个结果的。 有谁知道基础符号是什么以及我们如何得到这个结果?我在哪里可以读到这个符号?

2 个答案:

答案 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.)