The following bash script displays a decimal number when given binary number.
echo $((2#$1))
Why exactly ?
I understand that $1
is the input. Maybe 2
is the base (binary). But I can't understand the syntax used.
Super User is a question and answer site for computer enthusiasts and power users. It only takes a minute to sign up.
Sign up to join this communityThe following bash script displays a decimal number when given binary number.
echo $((2#$1))
Why exactly ?
I understand that $1
is the input. Maybe 2
is the base (binary). But I can't understand the syntax used.
man bash
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
indicates the [GNU bash, version 3.2.57] man page to be 4890 lines, 37094 words, 329778 characters. This answer strips that down to only the 7 lines, 176 words, 1115 characters that are relevant. I think that answer deserves your upvote. (as does this comment ;-)
– Bruno Bronosky
Jan 3 '17 at 17:25
From the Doc at: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
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 represent numbers between 10 and 35.
So echo $((16#FF))
outputs 255
and echo $((2#0110))
outputs 6
Ipor's answer is excellent but very slightly incomplete. The quoted part of the bash man page states that the [base#]n
syntax works only for constants, and 2#$1
is not a constant. You should be asking how this really works!
EXPANSION
Expansion is performed on the command line after it has been split into words. There are seven kinds of expansion performed: brace expansion, tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, word splitting, and pathname expansion.
The order of expansions is: brace expansion; tilde expansion, parameter and variable expansion, arithmetic expansion, and command substitution (done in a left-to-right fashion); word splitting; and pathname expansion.
Basically Bash is doing variable substitution first, so that the $1
is first replaced with its value. Only then does it do arithmetic expansion, which sees only a proper constant.
$1
is the input."
– Scott
Jan 3 '17 at 16:20
$1
is expanded to produce an integer constant before the arithmetic expression is evaluated. See gnu.org/software/bash/manual/bash.txt, section 3.5"
– chepner
Jan 4 '17 at 13:28
echo $((2#0110))
as you did and got '6'. Then you ask if 2 was the base. Well obviously. And it's not hard to test that. It's no coincidence thatecho $((2#0111))
is 7. and $((2#1000))` is 8. You got it for one binary number. So given that, then yeah you got it anyway , obviously – barlop Dec 16 '20 at 17:43echo $((2#0110)) = 6
part, because I noticed there was no direct example with output in my question and in the answers – NanoPish Dec 17 '20 at 10:54