script bash linux ejemplos
Diferencia entre ${} y $() en Bash (3)
Esta pregunta ya tiene una respuesta aquí:
- Backticks vs braces en Bash 2 respuestas
Tengo dos preguntas y necesito ayuda para entenderlas.
¿Cuál es la diferencia entre
${}
y$()
? Entiendo que()
significa ejecutar el comando en un shell separado y colocar$
significa pasar el valor a la variable. ¿Puede alguien ayudarme a entender esto? Por favor, corríjame si estoy equivocado.Si podemos usar
for ((i=0;i<10;i++)); do echo $i; done
for ((i=0;i<10;i++)); do echo $i; done
for ((i=0;i<10;i++)); do echo $i; done
y funciona bien, entonces ¿por qué no puedo usarlo comowhile ((i=0;i<10;i++)); do echo $i; done
while ((i=0;i<10;i++)); do echo $i; done
while ((i=0;i<10;i++)); do echo $i; done
? ¿Cuál es la diferencia en el ciclo de ejecución para ambos?
tu entendimiento es correcto Para obtener información detallada sobre {} ver bash ref - expansión de parámetros
''para'' y ''mientras'' tienen una sintaxis diferente y ofrecen diferentes estilos de control de programador para una iteración. La mayoría de los lenguajes que no son asm ofrecen una sintaxis similar.
Con mientras, probablemente escribirías i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done
i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done
i=0; while [ $i -lt 10 ]; do echo $i; i=$(( i + 1 )); done
en esencia, gestionar todo sobre la iteración
$()
significa: "primero evalúa esto, y luego evalúa el resto de la línea".Ex:
echo $(pwd)/myFile.txt
será interpretado como
echo /my/path/myFile.txt
Por otro lado
${}
expande una variable.Ex:
MY_VAR=toto echo ${MY_VAR}/myFile.txt
será interpretado como
echo toto/myFile.txt
¿Por qué no puedo usarlo como
bash$ while ((i=0;i<10;i++)); do echo $i; done
bash$ while ((i=0;i<10;i++)); do echo $i; done
Me temo que la respuesta es que la sintaxis de bash no es la misma que la de sintaxis.
La sintaxis es a nivel de token, por lo que el significado del signo de dólar depende del token en el que se encuentra. La expresión $(command)
es un sinónimo moderno de `command`
que significa sustitución de comando; significa, ejecute el command
y ponga su salida aquí. Asi que
echo "Today is $(date). A fine day."
ejecutará el comando de date
e incluirá su salida en el argumento a echo
. Los paréntesis no están relacionados con la sintaxis para ejecutar un comando en una subshell, aunque tienen algo en común (la sustitución del comando también se ejecuta en una subshell separada).
Por el contrario, ${variable}
es solo un mecanismo de desambiguación, por lo que puede decir ${var}text
cuando se refiere al contenido de la variable var
, seguido de text
(a diferencia de $vartext
que significa el contenido de la variable vartext
).
El bucle while espera un solo argumento que debe ser verdadero o falso (o en realidad múltiple, donde se examina el valor de verdad del último: gracias a Jonathan Leffler por señalarlo); cuando es falso, el bucle ya no se ejecuta. El bucle for
repite sobre una lista de elementos y, a su vez, se une a una variable de bucle; la sintaxis a la que hace referencia es una forma, bastante generalizada, de expresar un bucle en un rango de valores aritméticos.
Un bucle for
así se puede reformular como un bucle while. La expresion
for ((init; check; step)); do
body
done
es equivalente a
init
while check; do
body
step
done
Tiene sentido mantener todo el control de bucle en un lugar para que sea legible; pero como puede ver cuando se expresa así, el bucle for
hace un poco más que el bucle while.
Por supuesto, esta sintaxis es específica de Bash; La clásica concha de Bourne solo tiene
for variable in token1 token2 ...; do
(Un poco más elegante, podría evitar el echo
en el primer ejemplo, siempre y cuando esté seguro de que la cadena de argumento no contiene ningún código de formato %
:
date +''Today is %c. A fine day.''
Evitar un proceso en el que pueda ser una consideración importante para aprender, aunque no haga mucha diferencia en este ejemplo aislado.