scripts script programacion pasar parametros español ejemplos comandos bash shell syntax curly-braces

bash - script - ¿Cuándo necesitamos llaves alrededor de las variables de shell?



scripts bash ejemplos (6)

En shell scripts, ¿cuándo usamos {} al expandir variables?

Por ejemplo, he visto lo siguiente:

var=10 # Declare variable echo "${var}" # One use of the variable echo "$var" # Another use of the variable

¿Hay una diferencia significativa, o es solo estilo? ¿Se prefiere una sobre la otra?


El final del nombre de la variable generalmente se indica mediante un espacio o una nueva línea. Pero, ¿qué sucede si no queremos un espacio o una nueva línea después de imprimir el valor de la variable? Las llaves le indican al intérprete de shell dónde está el final del nombre de la variable.

Ejemplo clásico 1) - variable de shell sin espacios en blanco finales

TIME=10 # WRONG: no such variable called ''TIMEsecs'' echo "Time taken = $TIMEsecs" # What we want is $TIME followed by "secs" with no whitespace between the two. echo "Time taken = ${TIME}secs"

Ejemplo 2)

# WRONG CLASSPATH=hibernate-$LATESTVERSION_src.zip:hibernate_$LATEST_VERSION.jar

(La respuesta de Fred ya lo dice, pero su ejemplo es un poco demasiado abstracto)


En este ejemplo particular, no hace ninguna diferencia. Sin embargo, {} en ${} son útiles si desea expandir la variable foo en la cadena

"${foo}bar"

ya que "$foobar" expandiría foobar .

Los frenos también se requieren incondicionalmente cuando:

  • expandiendo elementos de matriz, como en ${array[42]}
  • utilizando operaciones de expansión de parámetros, como en ${filename%.*} (eliminar extensión)
  • expandiendo los parámetros posicionales más allá de 9: "$8 $9 ${10} ${11}"

Hacer esto en todas partes, en lugar de en casos potencialmente ambiguos, puede considerarse una buena práctica de programación. Esto es tanto por coherencia como para evitar sorpresas como $foo_$bar.jpg , donde no es obvio visualmente que el guión bajo se convierta en parte del nombre de la variable.


Las variables se declaran y asignan sin $ y sin {} . Tienes que usar

var=10

asignar. Para leer la variable (en otras palabras, ''expandir'' la variable), debe usar $ .

$var # use the variable ${var} # same as above ${var}bar # expand var, and append "bar" too $varbar # same as ${varbar}, i.e expand a variable called varbar, if it exists.

Esto me ha confundido a veces: en otros idiomas nos referimos a la variable de la misma manera, independientemente de si está a la izquierda o la derecha de una asignación. Pero el shell-scripting es diferente, $var=10 no hace lo que piensas que hace.


Siguiendo la sugerencia de SierraX y Peter acerca de la manipulación del texto, se utilizan corchetes {} para pasar una variable a un comando, por ejemplo:

Digamos que tiene un archivo sposi.txt que contiene la primera línea de una novela italiana conocida:

> sposi="somewhere/myfolder/sposi.txt" > cat $sposi

Ouput: quel ramo del lago di como che volge a mezzogiorno

Ahora crea dos variables:

# Search the 2nd word found in the file that "sposi" variable points to > word=$(cat $sposi | cut -d " " -f 2) # This variable will replace the word > new_word="filone"

Ahora sustituya la palabra variable contenido con la de new_word , dentro del archivo sposi.txt

> sed -i "s/${word}/${new_word}/g" $sposi > cat $sposi

Ouput: quel filone del lago di como che volge a mezzogiorno

La palabra "ramo" ha sido reemplazada.


También puedes hacer algo de manipulación de texto dentro de las llaves:

STRING="./folder/subfolder/file.txt" echo ${STRING} ${STRING%/*/*}

Resultado:

./folder/subfolder/file.txt ./folder

o

STRING="This is a string" echo ${STRING// /_}

Resultado:

This_is_a_string

No tiene la razón, no se necesitan "variables regulares" ... Pero es más útil para la depuración y para leer un script.


Utiliza {} para agrupar. Las llaves son necesarias para desreferir elementos de la matriz. Ejemplo:

dir=(*) # store the contents of the directory into an array echo "${dir[0]}" # get the first entry. echo "$dir[0]" # incorrect