2016-11-30 73 views
3

我有网线什么是在bash VAR = 64#@ _

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

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

回答

5

根据下算术扩展第三段man bash

如果省略基#,然后底座10使用。指定n时,大于9的数字将按照该顺序由小写字母,大写字母@和_表示。如果基数小于或等于36,则小写字母和大写字母可以互换使用以表示10到35之间的数字。

字母表a-z + A-Z + 0-9中只有62位数字。还需要两个。因此@和_只是数字的基数64表示中的数字。

$ echo "$((64#@))" 
62 
$ echo "$((64#_))" 
63 
$ echo "$((64#@@))" 
4030 
$ echo "$((64#@_))" 
4031 

我不能完全解释“4011”的结果。我相信这只是你的问题中的一个错字。

+0

据我所知,号码前#是数字。然而我的问题是我可以在哪里得到一个表格 - &,@ ._等等 – osamuyl

+0

@osamuyl 0-9分别是0-9。 a-z是10-35。 A-Z是36-61。 @是62. _是63.由于64是bash可以处理的最大基数,因此不允许其他字符。 – kojiro

+0

明白了。问题已关闭 – osamuyl

4

如果您输入help let,bash会告诉您有关let命令。它告诉bash将每个参数评估为算术表达式。

The bash reference manual解释了64#@_意味着:

与一家领先的0

常量解释为八进制数。领先的'0x'或'0X'表示十六进制。否则,数字形式为[base#] n,其中可选的基数是代表算术基数的2到64之间的十进制数,而n是该基数中的数字。如果base#被省略,则使用base10。当指定n时,大于9的数字按照小写字母,大写字母'@'和'_'的顺序表示。如果碱是小于或等于36,小写和大写字母可以互换地使用以表示10和35之间

号码所以你的指令分配一个数值来命名 b64变量。在bash的base 64中, @是数值为62的数字,而 _是数值为63的数字,所以总值为62×64 + 63×64 = 4031

(请注意,您错误地指出,结果是4011我使用bash版本4.2.48(1) - 释放测试,并获得4031)