echo $((2#$1)) 到底起什么作用?

echo $((2#$1)) 到底起什么作用?

以下 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))输出255echo $((2#0110))输出6

答案3

Ipor 的回答非常好,但略有不完整。bash 手册页的引用部分指出语法仅适用于常量,并且不是常量。你应该问这是怎么回事[base#]n2#$1真的作品!

扩张

    命令行在拆分成单词后进行扩展。扩展有七种类型:括号扩展、波浪线扩展、参数和变量扩展、命令替换、算术扩展、单词拆分和路径名扩展。

    扩展的顺序是:括号扩展;波浪号扩展、参数和变量扩展、算术扩展和命令替换(以从左到右的方式完成);单词拆分;和路径名扩展。

基本上,Bash 首先进行变量替换,因此$1首先用其值替换。然后它才进行算术扩展,这只会看到一个适当的常量。

相关内容