Zrozumienie `echo $ ((0x63))`

18

Szukałem sposobu konwersji szesnastkowej za pomocą wiersza poleceń i odkryłem, że jest to bardzo łatwa metoda echo $((0x63)).

Działa świetnie, ale jestem trochę zdezorientowany, co się tutaj dzieje.

Wiem, że $(...)jest to zwykle podpowłoka, której zawartość jest oceniana przed poleceniem zewnętrznym.

Czy w tej sytuacji jest to podpowłoka? Nie sądzę, by to oznaczało, że podpowłoka ocenia tylko, (0x63)co nie jest poleceniem.

Czy ktoś może złamać polecenie dla mnie?

Philip Kirkbride
źródło

Odpowiedzi:

27

$(...)jest podstawieniem polecenia (nie tylko podpowłoką), ale $((...))jest rozszerzeniem arytmetycznym.

Kiedy użyjesz $((...)), ...będzie interpretowane jako wyrażenie arytmetyczne. Oznacza to między innymi, że łańcuch szesnastkowy będzie interpretowany jako liczba i konwertowany na dziesiętny. Całe wyrażenie zostanie wówczas zastąpione wartością liczbową, na którą wyrażane jest wyrażenie.

Podobnie jak $((...))interpretacja parametrów i podstawianie poleceń, należy cytować, aby nie miało na nie wpływu dzielenie słów powłoki i globowanie nazw plików.

echo "$(( 0x63 ))"

Na marginesie, zmienne występujące w wyrażeniu arytmetycznym nie potrzebują ich $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
Kusalananda
źródło
2
Zauważ też, że ponieważ $((...))powoduje konflikt z zastępowaniem poleceń, należy pamiętać o pisaniu echo "$( (echo x; echo y) | tr xy yx)"zamiast echo "$((echo x; echo y) | tr xy yx)"(nawet jeśli niektóre powłoki nadal akceptują to drugie, YMMV).
Stéphane Chazelas
@ StéphaneChazelas A jak $(( ))wytwarzać produkty, na które wpływa podział tekstu lub globowanie?
Hauke ​​Laging
3
@HaukeLaging, IFS=9; echo $((0x63)). Zobacz także Implikacje bezpieczeństwa dla zapomnienia o cytowaniu zmiennej w powłokach bash / POSIX ( What about [ $# -gt 1 ]sekcja)
Stéphane Chazelas,
3

To nie jest podpowłoka, ale ocena arytmetyczna. Od man bash:

((wyrażenie))

Wyrażenie ocenia się zgodnie z zasadami opisanymi poniżej w części OCENA ARYTETYCZNA . Jeśli wartość wyrażenia jest różna od zera, zwracanym statusem jest 0; w przeciwnym razie zwracany jest status 1. Jest to dokładnie równoważne z wyrażeniem „wyrażenie”.

użytkownik4556274
źródło
9
((...))nie jest taki sam jak $((...)). Obie dokonują oceny arytmetycznej, ale ta ostatnia jest zastępowana przez wynikową wartość jako ciąg.
Kusalananda