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


53

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

echo $((2#$1))

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

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

Ответы:


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


25

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

РАСШИРЕНИЕ

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

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

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


Это кажется ненужным; ОП говорит: «Я понимаю, что $1это вход».
Скотт

8
+1, потому что понимание порядка расширения очень полезно для понимания многих различных выражений Bash.
Энтони Дж - правосудие для Моники

1
Это могло быть просто комментарием к ответу Ипора.
chepner

1
@chepner Пожалуйста, попробуйте втиснуть эту хорошо отформатированную цитату в комментарий :-)
Александр

1
«Обратите внимание, что параметр $1расширяется для получения целочисленной константы перед вычислением арифметического выражения. См. Gnu.org/software/bash/manual/bash.txt , раздел 3.5»
chepner
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.