)%3F.png)
Das folgende Bash-Skript zeigt eine Dezimalzahl an, wenn eine Binärzahl angegeben wird.
echo $((2#$1))
Warum genau?
Ich verstehe, dass das $1
die Eingabe ist. Vielleicht 2
ist es die Basis (binär). Aber ich verstehe die verwendete Syntax nicht.
Antwort1
Mann 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.
Antwort2
Aus dem Dokument unter:https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
Konstanten mit einer führenden 0 werden als Oktalzahlen interpretiert. Ein führendes „0x“ oder „0X“ bedeutet hexadezimal. Andernfalls haben die Zahlen die Form [Basis#]n, wobei die optionale Basis eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und n eine Zahl in dieser Basis ist. Wenn Basis# weggelassen wird, wird Basis 10 verwendet. Bei der Angabe von n werden die Ziffern größer als 9 durch Kleinbuchstaben, Großbuchstaben, „@“ und „_“ in dieser Reihenfolge dargestellt. Wenn die Basis kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.
Also echo $((16#FF))
Ausgänge 255
und echo $((2#0110))
Ausgänge6
Antwort3
Ipors Antwortist ausgezeichnet, aber ein wenig unvollständig. Der zitierte Teil der Bash-Manpage besagt, dass die Syntax nur für Konstanten funktioniert und keine Konstante ist. Sie sollten fragen, wie das[base#]n
2#$1
Wirklichfunktioniert!
ERWEITERUNG
Die Erweiterung wird in der Befehlszeile durchgeführt, nachdem diese in Wörter aufgeteilt wurde. Es gibt sieben Arten der Erweiterung: Klammernerweiterung, Tilde-Erweiterung, Parameter- und Variablenerweiterung, Befehlsersetzung, arithmetische Erweiterung, Wortaufteilung und Pfadnamenerweiterung.
Die Reihenfolge der Erweiterungen ist: Klammernerweiterung, Tilde-Erweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung und Befehlsersetzung (von links nach rechts durchgeführt), Worttrennung und Pfadnamenerweiterung.
Grundsätzlich führt Bash zuerst eine Variablensubstitution durch, sodass $1
zuerst durch den entsprechenden Wert ersetzt wird. Erst dann führt es eine arithmetische Erweiterung durch, die nur eine echte Konstante erkennt.