Что именно делает 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, где необязательное основание — это десятичное число от 2 до 64, представляющее арифметическую базу, а n — число в этой базе. Если base# опущено, то используется основание 10. При указании n цифры больше 9 представляются строчными буквами, заглавными буквами, «@» и «_» в указанном порядке. Если основание меньше или равно 36, строчные и заглавные буквы могут использоваться взаимозаменяемо для представления чисел от 10 до 35.

Итак, echo $((16#FF))выходы 255и echo $((2#0110))выходы6

решение3

Ответ Айпораотлично, но очень немного неполно. В цитируемой части страницы руководства bash указано, что синтаксис работает только для констант и не является константой. Вы должны спросить, как это[base#]n2#$1Действительноработает!

РАСШИРЕНИЕ

    Расширение выполняется в командной строке после ее разделения на слова. Существует семь видов выполняемого расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разделение слов и расширение имени пути.

    Порядок расширений следующий: расширение фигурных скобок; расширение тильды, расширение параметров и переменных, арифметическое расширение и подстановка команд (выполняется слева направо); разделение слов; и расширение имени пути.

По сути, Bash сначала выполняет замену переменной, так что $1сначала заменяется ее значением. Только затем он выполняет арифметическое расширение, которое видит только правильную константу.

Связанный контент