Понимание `echo $ ((0x63))`


18

Я искал способ конвертировать шестнадцатеричные через командную строку и обнаружил, что есть очень простой метод echo $((0x63)).

Это работает отлично, но я немного смущен тем, что здесь происходит.

Я знаю, $(...)что обычно это под-оболочка, где содержимое оценивается перед внешней командой.

Это все еще суб-оболочка в этой ситуации? Я не думаю, что это означало бы, что под-оболочка просто оценивает, (0x63)а не является командой.

Может кто-нибудь сломать команду для меня?

Ответы:


27

$(...)это подстановка команды (не просто подоболочка), а $((...))арифметическое расширение.

Когда вы используете $((...)), ...будет интерпретироваться как арифметическое выражение. Это означает, среди прочего, что шестнадцатеричная строка будет интерпретирована как число и преобразована в десятичную. Целое выражение будет тогда заменено числовым значением, к которому вычисляет выражение.

Подобно расширению параметров и подстановке команд, они $((...))должны быть заключены в кавычки, чтобы на них не влияли разбиение слов в оболочке и глобализация имени файла.

echo "$(( 0x63 ))"

В качестве примечания, переменные, встречающиеся в арифметическом выражении, не нуждаются в их $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78

2
Также обратите внимание, что, поскольку $((...))конфликтует с подстановкой команд, нужно помнить о записи echo "$( (echo x; echo y) | tr xy yx)"вместо echo "$((echo x; echo y) | tr xy yx)"(даже если некоторые оболочки по-прежнему будут принимать последнее, YMMV).
Стефан

@ StéphaneChazelas А как вы $(( ))производите продукцию, на которую влияет разделение слов или глобализация?
Hauke ​​Laging


3

Это не подоболочка, а арифметическая оценка. От man bash:

((Выражение))

Выражение оценивается в соответствии с правилами, описанными ниже в разделе АРИФМЕТИЧЕСКАЯ ОЦЕНКА . Если значение выражения не равно нулю, возвращаемое состояние равно 0; в противном случае возвращаемое состояние равно 1. Это в точности эквивалентно пустому выражению.


9
((...))не совсем так же, как $((...)). Оба выполняют арифметическую оценку, но последняя заменяется полученным значением в виде строки.
Кусалананда
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.