Wie wandelt man in Bash eine Basis von einer Dezimalzahl in eine andere Basis um, insbesondere hexadezimal. Es scheint einfach, den anderen Weg zu gehen:
$ echo $((16#55))
85
Bei einer Websuche habe ich ein Skript gefunden, das die Mathematik- und Zeichenmanipulation für die Konvertierung ausführt, und das könnte ich als Funktion verwenden, aber ich hätte gedacht, dass bash bereits eine integrierte Basiskonvertierung hat - macht es?
bash
shell
text-processing
hex
Dave Rove
quelle
quelle
Antworten:
Mit
bash
(oder einer beliebigen Shell, sofern derprintf
Befehl verfügbar ist (ein POSIX-Standardbefehl, der häufig in die Shells integriert ist):Mit
zsh
können Sie auch Folgendes tun:Das funktioniert für Basen von 2 bis 36 (wobei die
0-9a-z
Groß- und Kleinschreibung keine Rolle spielt).Mit
ksh93
können Sie Folgendes verwenden:Welches funktioniert für Basen von 2 bis 64 (mit
0-9a-zA-Z@_
als die Ziffern).Mit
ksh
undzsh
gibt es auch:Dies ist jedoch auf Basen bis zu 36 in ksh88, zsh und pdksh und 64 in ksh93 beschränkt.
Beachten Sie, dass alle diese Werte auf die Größe der
long
Ganzzahlen Ihres Systems beschränkt sind (int
mit einigen Shells). Für etwas größeres können Siebc
oder verwendendc
.Bei unterstützten Basen von 2 bis zu einer von POSIX geforderten Zahl von mindestens 99 werden Ziffern größer als 9 als durch Leerzeichen getrennte, mit 0 aufgefüllte Dezimalzahlen dargestellt.
Oder dasselbe mit
dc
(warbc
früher (und ist auf einigen Systemen immer noch) ein Wrapperdc
):quelle
#
?bash
builtins können Sie Eingangsnummern in jeder Basis, aber nicht ausgegeben in irgendeiner anderen Base als 8, 10 und 16. Für andere Basen, müssten Sie eine andere Shell wiezsh
oderksh
oder Verwendungbc/dc
.alias hex="printf '%x\n'"
Verwenden Sie printf:
Um den Wert einer Variablen zuzuweisen, verwenden Sie die Befehlssubstitution:
quelle
-v
Option für den eingebauten Ausdruck:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) zu verwenden. Ich würde es vermeiden.-v
würde die Gabel und das Rohr vermeiden (in Bash, nicht ksh93, das hier nichtprintf
gabelt, wie es eingebaut ist). Beachten Sie, dass dies auch$((16#55))
nicht Standard ist.x=$(some_builtin)
?Verwenden Sie die in allen POSIX-kompatiblen Shells integrierte Arithmetic Expansion-Substitution, die heutzutage praktisch universell ist.
und
VORSICHT: Insbesondere im letzten Beispiel kann die Erweiterung zu unerwarteten Ergebnissen führen. Die Hexadezimalziffern in der Variablen 'hex' müssen eine zulässige Hexadezimalkonstante bilden, da sonst möglicherweise undurchsichtige Fehlermeldungen auftreten. Beispiel: Wenn 'hex' '0xdead' wäre, würde die arithmetische Erweiterung zu 0x0xdead, was nicht als Konstante interpretiert werden kann. In diesem Fall würde natürlich die arithmetische Erweiterung $ (($ hex)) den Trick machen. Es ist eine Übung für den Leser, den einfachen Mustervergleich für die Teilzeichenfolgenverarbeitung zu erstellen, bei dem das optionale Präfix '0x' entfernt wird.
quelle
Sie können die awk Velour-Bibliothek verwenden :
Oder:
quelle