Comprensione di `echo $ ((0x63))`


18

Stavo cercando un modo per convertire esadecimali dalla riga di comando e ho scoperto che esiste un metodo molto semplice echo $((0x63)).

Funziona benissimo ma sono un po 'confuso su ciò che sta accadendo qui.

So che $(...)è normalmente una sotto-shell, in cui i contenuti vengono valutati prima del comando esterno.

È ancora un sotto-guscio in questa situazione? Non sto pensando che significherebbe che la sotto-shell sta solo valutando (0x63)che non è un comando.

Qualcuno può interrompere il comando per me?

Risposte:


27

$(...)è una sostituzione di comando (non solo una subshell), ma $((...))è un'espansione aritmetica.

Quando si utilizza $((...)), ...verrà interpretato come un'espressione aritmetica. Ciò significa, tra l'altro, che una stringa esadecimale verrà interpretata come un numero e convertita in decimale. L'intera espressione verrà quindi sostituita dal valore numerico a cui l'espressione valuta.

Come l'espansione dei parametri e la sostituzione dei comandi, $((...))devono essere citati in modo da non essere influenzati dalla suddivisione delle parole della shell e dal globbing del nome del file.

echo "$(( 0x63 ))"

Come nota a margine, le variabili presenti in un'espressione aritmetica non necessitano del loro $:

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

2
Si noti inoltre che, poiché è in $((...))conflitto con la sostituzione dei comandi, è necessario ricordare di scrivere echo "$( (echo x; echo y) | tr xy yx)"invece di echo "$((echo x; echo y) | tr xy yx)"(anche se alcune shell accetteranno comunque quest'ultima, YMMV).
Stéphane Chazelas,

@ StéphaneChazelas E come si $(( ))produce un output che è influenzato dalla suddivisione delle parole o dal globbing?
Hauke ​​Laging,

3
@HaukeLaging, IFS=9; echo $((0x63)). Vedi anche Implicazioni sulla sicurezza dell'oblio di citare una variabile nelle shell bash / POSIX ( What about [ $# -gt 1 ]sezione)
Stéphane Chazelas,

3

Questa non è una subshell, ma una valutazione aritmetica. Da man bash:

((espressione))

L'espressione viene valutata in base alle regole descritte di seguito in VALUTAZIONE ARITMETICA . Se il valore dell'espressione è diverso da zero, lo stato di ritorno è 0; altrimenti lo stato di ritorno è 1. Questo è esattamente equivalente a lasciare "espressione".


9
((...))non è esattamente lo stesso di $((...)). Entrambi eseguono una valutazione aritmetica, ma quest'ultima viene sostituita dal valore risultante come stringa.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.