script ejemplos linux bash scripting

script bash linux ejemplos



Diferencia entre ${} y $() en Bash (3)

Esta pregunta ya tiene una respuesta aquí:

Tengo dos preguntas y necesito 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. ¿Puede alguien 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?


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

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


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

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