glob / split
Tomaré el glob / split primero. La respuesta de @ Stephane a la que se vinculó es usar esos términos en un sentido general. No son comandos reales ni nada por el estilo, solo pseudo operaciones.
El split("$test")
dividiría el contenido de "$ test" en una "matriz" de elementos.
La glob(...)
entonces tener cuidado para expandir cualquiera de estos elementos que contienen la cáscara globbing caracteres tales como *
o rangos [1-2]
.
Ejemplo
Digamos que nuestra cadena $test
es la siguiente.
$ test="afile[1-2] afile[3-5]"
También digamos que tenemos un directorio con algunos archivos.
$ ls -1
afile1
afile2
afile3
afile4
afile5
Ahora, si tratamos de repetirlo sin comillas, debería notar que nuestra cadena se dividió en espacios, y luego se expandió cualquier carácter global.
$ echo $test
afile1 afile2 afile3 afile4 afile5
Sin embargo, si tuviéramos que citar la variable cuando la pasamos como un argumento echo
, obtendríamos la cadena literal original.
$ echo "$test"
afile[1-2] afile[3-5]
expansión variable
El término expansión variable está destinado a cubrir la operación básica que realiza el shell como parte de sus operaciones básicas. El shell es responsable de analizar la entrada y luego ejecutar esta entrada una vez que se considera sintácticamente correcta.
En nuestro ejemplo anterior. Cuando la variable $test
se presentó sin echo
comillas, le estábamos diciendo al shell que siguiera adelante y dividiera esos argumentos y luego los englobara.
Cuando fue citado, esencialmente estábamos deshabilitando esa característica con cualquier variable que envolviéramos con comillas dobles.
Ejemplo
Aquí hay algunos ejemplos adicionales de engrosamiento y división.
glob / división se produce automáticamente
$ echo file{1..3}
file1 file2 file3
$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb
$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD
$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC
Glob / división deshabilitado mediante comillas dobles
$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC
$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}