Що саме робить 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 для пояснення ZERO.
Макс Рійд

27
Це досить добре пояснено, я думаю
NanoPish

19
Повністю відповівши на запитання, навіть якщо "лише" шляхом купівлі існуючої документації, для мене не заслуговує -1. Зокрема, якщо ця документація є керуванням bash.
ЯнгФрог

30
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 або дорівнює 36, то для представлення чисел між 10 і 35 можуть використовуватися рядкові та малі літери.

Отже, echo $((16#FF))виходи 255та echo $((2#0110))виходи6


25

Відповідь Іпора відмінна, але дуже трохи неповна. У цитованій частині сторінки bash man зазначається, що синтаксис працює лише для констант, а не є постійною. Ви повинні запитати, як це насправді працює![base#]n2#$1

РОЗШИРЕННЯ

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

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

В основному Bash спочатку робить змінну підстановку, так що $1перший замінюється його значенням. Тільки тоді він робить арифметичне розширення, яке бачить лише належну константу.


Це здається непотрібним; ОП каже: "Я розумію, що $1це вхід".
Скотт

8
+1, тому що розуміння порядку розширення дуже корисно для розуміння багатьох різних виразів Баша.
Ентоні Геоґеган

1
Це міг бути просто коментарем до відповіді Іпора.
чепнер

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.