Antworten:
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.
man bash | wc
gibt an, dass die Manpage [GNU bash, Version 3.2.57] 4890 Zeilen, 37094 Wörter , 329778 Zeichen enthält. Diese Antwort zeigt, dass nur die 7 Zeilen, 176 Wörter und 1115 Zeichen relevant sind. Ich denke, diese Antwort verdient Ihre Zustimmung. (Wie auch dieser Kommentar ;-)
Aus dem Doc 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. Ansonsten haben Zahlen die Form [base #] 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 base # weggelassen wird, wird base 10 verwendet. Wenn Sie n angeben, werden die Ziffern größer als 9 durch die Kleinbuchstaben, die Großbuchstaben '@' und '_' in dieser Reihenfolge dargestellt. Wenn base 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
Die Antwort von Ipor ist ausgezeichnet, aber sehr leicht unvollständig. Der zitierte Teil der Bash-Manpage besagt, dass die Syntax nur für Konstanten funktioniert und keine Konstante ist. Sie sollten sich fragen, wie das wirklich funktioniert![base#]n
2#$1
ERWEITERUNG
Die Erweiterung wird in der Befehlszeile ausgeführt, nachdem sie in Wörter aufgeteilt wurde. Es werden sieben Arten von Erweiterungen durchgeführt: Klammererweiterung, Tildeerweiterung, Parameter- und Variablenerweiterung, Befehlssubstitution, arithmetische Erweiterung, Wortteilung und Pfadnamenerweiterung.
Die Reihenfolge der Erweiterungen ist: Klammererweiterung; Tildeerweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung und Befehlssubstitution (von links nach rechts); Wortspaltung; und Pfadnamenerweiterung.
Grundsätzlich setzt Bash zuerst Variablen ein, so dass diese $1
zuerst durch ihren Wert ersetzt werden. Nur dann führt es eine arithmetische Expansion durch, die nur eine richtige Konstante sieht.
$1
ist der Input."
$1
erweitert wird, um eine Ganzzahlkonstante zu erzeugen, bevor der arithmetische Ausdruck ausgewertet wird. Siehe gnu.org/software/bash/manual/bash.txt , Abschnitt 3.5"