Diferencia entre $ {} y $ () en Bash

Tengo dos preguntas y podría necesitar ayuda para entenderlas.

  1. ¿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.

  2. 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).

  1. $() 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 
  2. ¿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 .

  1. tu entendimiento es correcto Para obtener información detallada sobre {} ver bash ref – expansión de parámetros

  2. ‘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