Розуміння `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
@HaukeLaging, IFS=9; echo $((0x63)). Дивіться також наслідки для безпеки забуття процитувати змінну в оболонках bash / POSIX ( What about [ $# -gt 1 ]розділ)
Stéphane Chazelas

3

Це не підшлунок, а арифметична оцінка. Від man bash:

((вираз))

Вираз оцінюється за правилами, описаними нижче в АРИТМЕТИЧНІЙ ОЦІНКІ . Якщо значення виразу не дорівнює нулю, стан повернення дорівнює 0; інакше статус повернення дорівнює 1. Це абсолютно рівнозначно вираженню "вираз".


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