什么是在bash中的var=64#@_?

3
我有网络线。
let "b64 = 64#@_" # the result is 4011    
echo "b64 = $b64" # is 4011    

我们是如何得出这个结果的呢?有人知道什么是数制表示法吗?我们是如何得出这个结果的呢?我在哪里可以阅读关于这种表示法的内容呢?
2个回答

5
根据ARITHMETIC EXPANSION下第三段话中man bash的说法:如果省略了base#,则使用base 10。在指定n时,大于9的数字由小写字母、大写字母、@和_表示,按照这个顺序。如果base小于或等于36,则可以交替使用小写字母和大写字母来表示10到35之间的数字。
字母表a-z + A-Z + 0-9只有62个数字。还需要两个数字,因此@和_只是数字在基64表示中的表示形式。
$ echo "$(( 64#@ ))"
62
$ echo "$(( 64#_ ))"
63
$ echo "$(( 64#@@ ))"
4030
$ echo "$(( 64#@_ ))"
4031

我无法完全解释“4011”的含义,我认为这只是您问题中的一个笔误。


我知道#前面的数字是编号。但我的问题是,我在哪里可以找到一个带有符号-&,@._等的表格? - osamuyl
@osamuyl 0-9分别为0-9。a-z为10-35。A-Z为36-61。@为62。_为63。由于64是bash可以处理的最大基数,因此不允许使用其他字符。 - kojiro
明白了。问题已关闭。 - osamuyl
@osamuyl,您可以通过单击正确答案旁边的绿色复选标记来将其标记为正确答案。这将完成问答过程。 - kojiro

4
如果您输入help let,bash将告诉您有关let命令的信息。它告诉bash将每个参数作为算术表达式进行评估。 Bash参考手册解释了64#@_的含义:
常量以0开头被解释为八进制数。前导“0x”或“0X”表示十六进制。否则,数字采用[base#]n的形式,其中可选的base是介于2和64之间的十进制数,表示算术基数,n是该基数中的数字。如果省略base#,则使用基数10。在指定n时,大于9的数字按小写字母,大写字母,“@”和“_”的顺序表示。如果基数小于或等于36,则可以互换使用小写和大写字母来表示10到35之间的数字。

所以你的命令将一个数字值赋给名为b64的变量。该数字值是基于64位的。在bash的base 64中,@是具有值62的数字,_是具有值63的数字,因此总值为62×641 + 63×640 = 4031。

(注意,你错误地声明结果为4011。我使用的bash版本是4.2.48(1)-release,得到的结果是4031。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接