En los scripts de shell, ¿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 uno sobre el otro?
bash
shell
syntax
curly-braces
Nuevo Usuario
fuente
fuente
{}
se conoce como expansión de llaves .${}
se conoce como expansión variable. Ellos hacen cosas diferentes. Te votaré a excepción del bit de no expansión.$()
se usa para ejecutar un comando, de modo quemd5sum=$(md5sum foo.bin)
almacenará la salida demd5sum foo.bin
en la variablemd5sum
, ahora accesible usando${md5sum}
. Además, ¡+1 y muchos más en espíritu a OP por mencionar que es una buena práctica ser explícito!$()
ejecuta su comando desde una subshell .${1:-20}
es una forma de expansión de parámetros. Aquí no es obvio porque usa principalmente dígitos y operadores aritméticos que nos engañan al pensar que hay aritmética involucrada, pero en realidad se refiere al parámetro posicional$1
, que si no se define será reemplazado por un valor predeterminado20
(la sintaxis es${variable:-default_value}
).Las variables se declaran y asignan sin
$
y sin{}
. Tienes que usarasignar. Para leer desde la variable (en otras palabras, 'expandir' la variable), debe usar
$
.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 a la derecha de una tarea. Pero el scripting de shell es diferente, ¡
$var=10
no hace lo que crees que hace!fuente
Usas
{}
para agrupar. Las llaves son necesarias para desreferenciar los elementos de la matriz. Ejemplo:fuente
dir=(*)
. Hasta donde sé,dir
es un comando incorporado para enumerar el contenido del directorio (equivalente als -C -b
). ¿Podría explicar por favor?dir
es el nombre de la variable, y los paréntesis se utilizan para recopilar la expansión del nombre de archivo*
en una matriz.También puede realizar algunas manipulaciones de texto dentro de las llaves:
Resultado:
o
Resultado:
Tienes razón en "variables regulares" no son necesarias ... Pero es más útil para la depuración y para leer un script.
fuente
El final del nombre de la variable generalmente se indica con un espacio o una nueva línea. Pero, ¿qué pasa si no queremos un espacio o una nueva línea después de imprimir el valor variable? Las llaves 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 al final
Ejemplo 2) Classpath de Java con jarras versionadas
(La respuesta de Fred ya lo dice, pero su ejemplo es demasiado abstracto)
fuente
Las llaves se necesitan siempre para acceder a los elementos de la matriz y llevar a cabo la expansión de llaves.
Es bueno no ser demasiado cauteloso y usarlo
{}
para la expansión variable de shell incluso cuando no hay margen para la ambigüedad.Por ejemplo:
Por lo tanto, es mejor escribir las tres líneas como:
que definitivamente es más legible.
Como un nombre de variable no puede comenzar con un dígito, el shell no necesita
{}
alrededor de variables numeradas (como$1
,$2
etc.) a menos que dicha expansión sea seguida por un dígito. Eso es demasiado sutil y hace que se use explícitamente{}
en tales contextos:Ver:
fuente
It's good to be not over-cautious
: Me pregunto qué piensa la mayoría de la gente. Use llaves todo el tiempo para no olvidarlas cuando las necesite, o úselas solo donde sea necesario, para mejorar la legibilidad.Siguiendo las sugerencias de SierraX y Peter sobre la manipulación de texto, las llaves
{}
se utilizan para pasar una variable a un comando, por ejemplo:Digamos que tiene un archivo sposi.txt que contiene la primera línea de una conocida novela italiana:
Ouput:
quel ramo del lago di como che volge a mezzogiorno
Ahora cree dos variables:
Ahora sustituya el contenido variable de la palabra con el de new_word , dentro del archivo sposi.txt
Ouput:
quel filone del lago di como che volge a mezzogiorno
La palabra "ramo" ha sido reemplazada.
fuente
weel-known novel
bit. Votado sin embargo.