)%3F.png)
Следующий 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#]n
2#$1
Действительноработает!
РАСШИРЕНИЕ
Расширение выполняется в командной строке после ее разделения на слова. Существует семь видов выполняемого расширения: расширение фигурных скобок, расширение тильды, расширение параметров и переменных, подстановка команд, арифметическое расширение, разделение слов и расширение имени пути.
Порядок расширений следующий: расширение фигурных скобок; расширение тильды, расширение параметров и переменных, арифметическое расширение и подстановка команд (выполняется слева направо); разделение слов; и расширение имени пути.
По сути, Bash сначала выполняет замену переменной, так что $1
сначала заменяется ее значением. Только затем он выполняет арифметическое расширение, которое видит только правильную константу.