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í?

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

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".


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.