Следующий скрипт bash отображает десятичное число, если задано двоичное число.
echo $((2#$1))
Почему именно?
Я понимаю, что $1
это вход. Может быть, 2
это база (двоичная). Но я не могу понять используемый синтаксис.
человек баш
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.
man bash | wc
указывает, что страница руководства [GNU bash, версия 3.2.57] содержит 4890 строк, 37094 слова , 329778 символов. Этот ответ сокращает до 7 строк, 176 слов и 1115 символов. Я думаю, что этот ответ заслуживает вашего одобрения. (как и этот комментарий ;-)Из документа по адресу: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic.
Итак,
echo $((16#FF))
выводы255
иecho $((2#0110))
выводы6
источник
Ответ Ипора отличный, но немного неполный. В цитируемой части справочной страницы bash говорится, что синтаксис работает только для констант и не является константой. Вы должны спросить, как это действительно работает!
[base#]n
2#$1
По сути, Bash сначала выполняет подстановку переменных, поэтому
$1
сначала ее заменяет ее значение. Только тогда он делает арифметическое расширение, которое видит только правильную константу.источник
$1
это вход».$1
расширяется для получения целочисленной константы перед вычислением арифметического выражения. См. Gnu.org/software/bash/manual/bash.txt , раздел 3.5»