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.
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.
echo command was unnecessary.
– Scott - Слава Україні
Jan 03 '17 at 16:19
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 03 '17 at 17:25
/2# gives 0 results, but seriously this is not a place for debate and 1337ism. My comment was intended to encourage community not exacerbate division. There is an important cultural difference between SE and Reddit/4chan/etc.
– Bruno Bronosky
Jan 03 '17 at 20:46
man bash > bashman.txt, make it read only and throw it into kate. I just have to remember to get a new version every so often. It's nice to have a script on one tab and the manual on another. I do the same thing for awk and yad.
– Joe
Jan 04 '17 at 03:46
man bash | kate -i if you're not worried about the filename. Or man bash | gedit - for folk who use gedit. Note the dash on the end.
– seumasmac
Jan 04 '17 at 12:58
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 03 '17 at 16:20
$1 is expanded to produce an integer constant before the arithmetic expression is evaluated. See https://www.gnu.org/software/bash/manual/bash.txt, section 3.5"
– chepner
Jan 04 '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)) = 6part, because I noticed there was no direct example with output in my question and in the answers – NanoPish Dec 17 '20 at 10:54