Comprender `echo $ ((0x63))`

18

Estaba buscando una forma de convertir hexadecimal a través de la línea de comandos y descubrí que hay un método muy fácil echo $((0x63)).

Funciona muy bien, pero estoy un poco confundido sobre lo que está sucediendo aquí.

$(...)que normalmente es un sub-shell, donde los contenidos se evalúan antes del comando externo.

¿Sigue siendo un sub-shell en esta situación? No estoy pensando, ya que eso significaría que el subconjunto solo está evaluando (0x63)cuál no es un comando.

¿Alguien puede romper el comando por mí?

Philip Kirkbride
fuente

Respuestas:

27

$(...)es una sustitución de comando (no solo una subshell), sino que $((...))es una expansión aritmética.

Cuando lo use $((...)), ...se interpretará como una expresión aritmética. Esto significa, entre otras cosas, que una cadena hexadecimal se interpretará como un número y se convertirá a decimal. La expresión completa será reemplazada por el valor numérico que evalúa la expresión.

Al igual que la expansión de parámetros y la sustitución de comandos, $((...))debe citarse para que no se vea afectado por la división de palabras del shell y el bloqueo de nombre de archivo.

echo "$(( 0x63 ))"

Como nota al margen, las variables que ocurren en una expresión aritmética no necesitan su $:

$ x=030; y=30; z=0x30
$ echo "$(( x + y +x ))"
78
Kusalananda
fuente
2
También tenga en cuenta que debido a $((...))conflictos con la sustitución de comandos, uno debe recordar escribir en echo "$( (echo x; echo y) | tr xy yx)"lugar de echo "$((echo x; echo y) | tr xy yx)"(a pesar de que algunos shells aún aceptarán el último, YMMV).
Stéphane Chazelas
@ StéphaneChazelas ¿Y cómo hace que la $(( ))producción se vea afectada por la división de palabras o el pegoteo?
Hauke ​​Laging
3
@HaukeLaging, IFS=9; echo $((0x63)). Consulte también Implicaciones de seguridad de olvidarse de citar una variable en bash / POSIX shells ( What about [ $# -gt 1 ]sección)
Stéphane Chazelas
3

Esto no es una subshell, sino una evaluación aritmética. De man bash:

((expresión))

La expresión se evalúa de acuerdo con las reglas que se describen a continuación en EVALUACIÓN ARITMÉTICA . Si el valor de la expresión no es cero, el estado de retorno es 0; de lo contrario, el estado de retorno es 1. Esto es exactamente equivalente a dejar "expresión".

usuario4556274
fuente
99
((...))no es exactamente lo mismo que $((...)). Ambos realizan evaluaciones aritméticas, pero el último se reemplaza por el valor resultante como una cadena.
Kusalananda