Что именно делает echo $ ((2 # $ 1))?

53

Следующий скрипт bash отображает десятичное число, если задано двоичное число.

echo $((2#$1))

Почему именно?

Я понимаю, что $1это вход. Может быть, 2это база (двоичная). Но я не могу понять используемый синтаксис.

NanoPish
источник

Ответы:

72

человек баш

   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.
Ипор Сирсер
источник
66
-1 для нулевого объяснения.
Макс
27
Это довольно хорошо объяснено, я думаю
NanoPish
19
Полноценный ответ на вопрос, даже если «только» путем исправления существующей документации, не заслуживает -1 для меня. В частности, если эта документация является справочной страницей bash.
YoungFrog
31
man bash | wcуказывает, что страница руководства [GNU bash, версия 3.2.57] содержит 4890 строк, 37094 слова , 329778 символов. Этот ответ сокращает до 7 строк, 176 слов и 1115 символов. Я думаю, что этот ответ заслуживает вашего одобрения. (как и этот комментарий ;-)
Бруно Броноски
7
@MaxRied: -1 к вашему комментарию за поиск ненужного пуха
Mehrdad
30

Из документа по адресу: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic.

Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий '0x' или '0X' обозначает шестнадцатеричное. В противном случае числа принимают форму [base #] n, где необязательное основание - это десятичное число от 2 до 64, представляющее арифметическое основание, а n - это число в этом основании. Если база # опущена, то используется база 10. При указании n цифры больше 9 представляются строчными буквами, заглавными буквами '@' и '_' в указанном порядке. Если основание меньше или равно 36, строчные и прописные буквы могут использоваться взаимозаменяемо для представления чисел от 10 до 35.

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

itshorty
источник
25

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

РАСШИРЕНИЕ

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

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

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

db48x
источник
Это кажется ненужным; ОП говорит: «Я понимаю, что $1это вход».
Скотт
8
+1, потому что понимание порядка расширения очень полезно для понимания многих различных выражений Bash.
Энтони Дж - правосудие для Моники
1
Это могло быть просто комментарием к ответу Ипора.
chepner
1
@chepner Пожалуйста, попробуйте втиснуть эту хорошо отформатированную цитату в комментарий :-)
Александр
1
«Обратите внимание, что параметр $1расширяется для получения целочисленной константы перед вычислением арифметического выражения. См. Gnu.org/software/bash/manual/bash.txt , раздел 3.5»
chepner