W Bash, w jaki sposób wykonuje się konwersję podstawy z dziesiętnej na inną podstawę, zwłaszcza szesnastkową. Wydaje się, że łatwo jest pójść w drugą stronę:
$ echo $((16#55))
85
Podczas wyszukiwania w Internecie znalazłem skrypt, który wykonuje matematykę i manipulacje postaciami w celu konwersji i mógłbym użyć tego jako funkcji, ale pomyślałem, że bash miałby już wbudowaną podstawową konwersję - czy to?
bash
shell
text-processing
hex
Dave Rove
źródło
źródło
Odpowiedzi:
Za pomocą
bash
(lub dowolnej powłoki, pod warunkiem, żeprintf
polecenie jest dostępne (standardowe polecenie POSIX często wbudowane w powłoki)):Za pomocą
zsh
możesz także:Działa to dla baz od 2 do 36 (z
0-9a-z
rozróżnianiem wielkości liter jak cyfry).Za pomocą
ksh93
możesz użyć:Który działa dla baz od 2 do 64 (z
0-9a-zA-Z@_
cyframi).Z
ksh
izsh
są też:Chociaż jest to ograniczone do baz do 36 w ksh88, zsh i pdksh i 64 w ksh93.
Zauważ, że wszystkie one są ograniczone do wielkości
long
liczb całkowitych w twoim systemie (int
z niektórymi powłokami). Do czegokolwiek większego możesz użyćbc
lubdc
.Przy obsługiwanych podstawach od 2 do pewnej liczby wymaganej przez POSIX do co najmniej tak wysokiej, jak 99. W przypadku zasad większych niż 16, cyfry większe niż 9 są reprezentowane jako oddzielone spacjami liczby dziesiętne uzupełnione zerami.
Lub to samo z
dc
(bc
kiedyś (i nadal jest w niektórych systemach) otokądc
):źródło
#
?bash
poleceń wbudowanych, można wejść liczby w dowolnym systemie, ale nie wyjście w jakiejkolwiek innej podstawy niż 8, 10 i 16. W przypadku innych baz, to by trzeba inną powłokę podobnegozsh
lubksh
lub wykorzystaniebc/dc
.alias hex="printf '%x\n'"
Użyj printf:
Aby przypisać wartość do zmiennej, użyj podstawienia polecenia:
źródło
-v
opcji wbudowanego printf:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) nie jest tutaj konieczne; Unikałbym tego.-v
unikałby rozwidlenia i potoku (w bash, nie ksh93, który nie rozwidliby się tutaj, jakprintf
jest wbudowany). Pamiętaj, że$((16#55))
nie jest to również standard.x=$(some_builtin)
?Użyj wbudowanego podstawienia rozszerzenia arytmetycznego obecnego we wszystkich powłokach zgodnych z POSIX - co jest obecnie dość uniwersalne.
i
UWAGA: Szczególnie w ostatnim przykładzie rozszerzenie może powodować nieoczekiwane wyniki - cyfry szesnastkowe w zmiennej „hex” muszą tworzyć legalną stałą szesnastkową, w przeciwnym razie mogą wystąpić niejasne komunikaty o błędach. np. jeśli „hex” to „0xdead”, rozszerzenie arytmetyczne zmieniłoby się na 0x0xdead, którego nie można interpretować jako stałą. Oczywiście w takim przypadku arytmetyczna ekspansja $ (($ hex)) załatwi sprawę. Pozostawia się czytelnikowi ćwiczenie polegające na stworzeniu prostego dopasowania wzorca przetwarzania podciągu, który usunąłby opcjonalny prefiks „0x”.
źródło
Możesz użyć biblioteki awk Velor :
Lub:
źródło