Tengo dos preguntas y podría necesitar 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. ¿Alguien puede 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 como while ((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?
La syntax es token-level, 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 para `command`
que significa sustitución de comando; significa, ejecutar command
y poner su salida aquí. Asi que
echo "Today is $(date). A fine day."
ejecutará el comando de date
e incluirá su resultado en el argumento para echo
. Los paréntesis no están relacionados con la syntax para ejecutar un comando en una subcadena, aunque tienen algo en común (la sustitución del comando también se ejecuta en una subcapa separada).
Por el contrario, ${variable}
es solo un mecanismo de desambiguación, por lo que puede decir ${var}text
cuando quiere decir, los contenidos de la variable var
, seguidos de text
(en lugar de $vartext
que significa el contenido de la variable vartext
).
El ciclo while espera un único argumento que debe evaluarse como verdadero o falso (o realmente múltiple, donde se examina el valor de verdad del último – gracias Jonathan Leffler por señalar esto); cuando es falso, el ciclo ya no se ejecuta. El bucle for
itera sobre una lista de elementos y une cada uno a una variable de bucle por turno; la syntax a la que se refiere es una forma bastante generalizada de express un ciclo sobre un rango de valores aritméticos.
Un bucle for
ese tipo se puede reformular como un ciclo 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 solo lugar para su legibilidad; pero como puede ver cuando se expresa así, el bucle for
hace bastante más que el bucle while.
Por supuesto, esta syntax es específica de Bash; clásico Bourne shell solo tiene
for variable in token1 token2 ...; do
(Algo más elegantemente, podría evitar el echo
en el primer ejemplo, siempre y cuando esté seguro de que su cadena de argumentos no contiene ningún código de formato %
:
date +'Today is %c. A fine day.'
Evitar un proceso donde se puede es una consideración importante para aprender, a pesar de que no hace una gran diferencia en este ejemplo aislado).
$()
significa: “primero evalúe esto y luego evalúe el rest de la línea”.
Ej .:
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 solo que la syntax de bash por solo no es lo mismo que la syntax de for
.
tu entendimiento es correcto Para obtener información detallada sobre {} ver bash ref – expansión de parámetros
‘for’ y ‘while’ tienen una syntax diferente y ofrecen diferentes estilos de control de progtwigdor para una iteración. La mayoría de los lenguajes que no son ASM ofrecen una syntax similar.
Con tiempo, 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 administrar todo sobre la iteración usted mismo