В Bash, как сделать преобразование базы из десятичной в другую, особенно в шестнадцатеричную. Кажется, легко пойти другим путем:
$ echo $((16#55))
85
С помощью веб-поиска я нашел скрипт, который выполняет математические и символьные манипуляции для преобразования, и я мог бы использовать это как функцию, но я бы подумал, что bash уже имеет встроенное базовое преобразование - Является ли?
bash
shell
text-processing
hex
Дейв Роув
источник
источник
Ответы:
С помощью
bash
(или любой оболочки при условии, чтоprintf
команда доступна (стандартная команда POSIX, часто встроенная в оболочки)):С помощью
zsh
вы также можете сделать:Это работает для баз от 2 до 36 (с
0-9a-z
учетом регистра без учета цифр).С помощью
ksh93
вы можете использовать:Который работает для баз от 2 до 64 (с
0-9a-zA-Z@_
цифрами).С
ksh
иzsh
есть также:Хотя это ограничено основами до 36 в ksh88, zsh и pdksh и 64 в ksh93.
Обратите внимание, что все они ограничены размером
long
целых чисел в вашей системе (int
с некоторыми оболочками). Для чего-то большего, вы можете использоватьbc
илиdc
.При поддерживаемых базах в диапазоне от 2 до некоторого числа POSIX должно быть не менее 99. Для баз, превышающих 16, цифры больше 9 представляются в виде разделенных пробелами 0-запятых десятичных чисел.
Или то же самое с
dc
(bc
раньше было (и до сих пор есть в некоторых системах) оболочкойdc
):источник
#
?bash
встроенных команд, вы можете ввода чисел в любой системе счисления, но не выводится в любом основании, кроме 8, 10 и 16. Для других баз, вам потребуется еще один снаряд , какzsh
илиksh
или использованиеbc/dc
.alias hex="printf '%x\n'"
Используйте printf:
Чтобы присвоить значение переменной, используйте подстановку команд:
источник
-v
опцию для встроенного printf:printf -v foo "%d" $((16#BEEF)); echo $foo
-v
) здесь не нужно; Я бы избежал этого.-v
будет избегать форка и трубы (в bash, а не в ksh93, который не будет форкнуть здесь, какprintf
встроено). Обратите внимание, что$((16#55))
это не является стандартным.x=$(some_builtin)
?Используйте встроенную замену Arithmetic Expansion, присутствующую во всех POSIX-совместимых оболочках, что в наши дни является довольно универсальным.
а также
ВНИМАНИЕ: В частности, в последнем примере расширение может привести к непредвиденным результатам - шестнадцатеричные цифры в переменной «hex» должны образовывать допустимую шестнадцатеричную константу, в противном случае могут появиться потенциально неясные сообщения об ошибках. например, если 'hex' было '0xdead', арифметическое расширение стало бы 0x0xdead, что не интерпретируется как константа. Конечно, в этом случае арифметическое расширение $ (($ hex)) сделает свое дело. Читателю оставлено в качестве упражнения создание простого сопоставления с шаблоном обработки подстроки, которое бы удалило необязательный префикс «0x».
источник
Вы можете использовать библиотеку awk Velor :
Или:
источник