以下 bash 脚本在给定二进制数时显示十进制数。
echo $((2#$1))
为什么呢?
我知道这$1
是输入。也许2
是基数(二进制)。但我不明白使用的语法。
答案1
男子猛击
echo [-neE] [arg ...]
Output the args, separated by spaces, followed by a newline.
The return status is 0 unless a write error occurs. If -n is
specified, the trailing newline is suppressed. If the -e option
is given, interpretation of the following backslash-escaped
characters is enabled.
[...]
Arithmetic Expansion
Arithmetic expansion allows the evaluation of an arithmetic expression
and the substitution of the result. The format for arithmetic expan‐
sion is:
$((expression))
[...]
Constants with a leading 0 are interpreted as octal numbers. A leading
0x or 0X denotes hexadecimal. Otherwise, numbers take the form
[base#]n, where the optional base is a decimal number between 2 and 64
representing the arithmetic base, and n is a number in that base. If
base# is omitted, then base 10 is used. When specifying n, the digits
greater than 9 are represented by the lowercase letters, the uppercase
letters, @, and _, in that order. If base is less than or equal to 36,
lowercase and uppercase letters may be used interchangeably to repre‐
sent numbers between 10 and 35.
答案2
来自文档:https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
以 0 开头的常量被解释为八进制数。以 '0x' 或 '0X' 开头的常量表示十六进制数。否则,数字采用 [base#]n 的形式,其中可选的 base 是 2 到 64 之间的十进制数,表示算术基数,n 是该基数中的数字。如果省略 base#,则使用基数 10。指定 n 时,大于 9 的数字按顺序用小写字母、大写字母、'@' 和 '_' 表示。如果 base 小于或等于 36,则可以互换使用小写字母和大写字母来表示 10 到 35 之间的数字。
所以echo $((16#FF))
输出255
和echo $((2#0110))
输出6
答案3
Ipor 的回答非常好,但略有不完整。bash 手册页的引用部分指出语法仅适用于常量,并且不是常量。你应该问这是怎么回事[base#]n
2#$1
真的作品!
扩张
命令行在拆分成单词后进行扩展。扩展有七种类型:括号扩展、波浪线扩展、参数和变量扩展、命令替换、算术扩展、单词拆分和路径名扩展。
扩展的顺序是:括号扩展;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);单词拆分;和路径名扩展。
基本上,Bash 首先进行变量替换,因此$1
首先用其值替换。然后它才进行算术扩展,这只会看到一个适当的常量。