Expansión Bash Shell
Una de las operaciones del shell cuando analiza la entrada es la expansión del Shell. Bash proporciona diferentes tipos de expansión. En este artículo, repasemos una expansión importante:"Expansión de refuerzo".
Este artículo es parte de nuestra serie de tutoriales de Bash en curso.
Expansión de refuerzos
La expansión de llaves se usa para generar cadenas arbitrarias. La expansión de llaves le permite crear múltiples argumentos de línea de comando modificados a partir de un solo argumento. Las cadenas especificadas se utilizan para generar todas las combinaciones posibles con los preámbulos y postscripts circundantes opcionales. El preámbulo se antepone a cada cadena contenida entre llaves, y luego se agrega la posdata a cada cadena resultante, expandiéndose de izquierda a derecha.
$ echo last{mce,boot,xorg}.log lastmce.log lastboot.log lastxorg.log where last is Preamble and .log is the postscript
La declaración de eco anterior le evita especificar los tres archivos de registro por separado. Si desea ver el contenido del último registro de arranque, registro mce y registro xorg, puede usar la expansión de llaves como se muestra en la declaración de eco anterior.
1. Ejemplo de copia de seguridad con expansión de llaves
$ cat bkup.sh set -x # expand the commands da=`date +%F` cp $da.log{,.bak} $ ./bkup.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log 2010-05-28.log.bak
En el script de copia de seguridad anterior, copia el archivo de registro de fecha actual con la extensión .bak. El primer elemento está vacío entre llaves, por lo que el primer elemento solo tendrá un preámbulo.
2. Ejemplo para Restaurar usando expansión de llave
$ cat restore.sh set -x # expand the commands da=`date +%F` cp $da.log{.bak,} $ ./restore.sh ++ date +%F + da=2010-05-28 + cp 2010-05-28.log.bak 2010-05-28.log
En el script de restauración, el primer elemento del parámetro es .bak, mientras que el segundo elemento está vacío.
Además, consulte nuestro artículo anterior sobre las funciones de bash shell para leer más.
3. Ejemplo de Brace Expansion sin preámbulo y posdata
Si no hay un preámbulo y una posdata, simplemente expande los elementos dados entre llaves.
$ cat expand.sh echo {oct,hex,dec,bin} $ ./expand.sh oct hex dec bin
Sin las cadenas opcionales de preámbulo y postscript, el resultado es solo una lista separada por espacios de las cadenas dadas
Expansión de llaves para rangos
La expansión de llaves también expande las secuencias. Las secuencias pueden ser de números enteros o de caracteres.
4. Ejemplo para secuencias de enteros y caracteres
$ cat sequence.sh cat /var/log/messages.{1..3} echo {a..f}{1..9}.txt $ ./sequence.sh May 9 01:18:29 x3 ntpd[2413]: time reset -0.132703 s May 9 01:22:38 x3 ntpd[2413]: synchronized to LOCAL(0), stratum 10 May 9 01:23:44 x3 ntpd[2413]: synchronized to May 9 01:47:48 x3 dhclient: DHCPREQUEST on eth0 May 9 01:47:48 x3 dhclient: DHCPACK from 23.42.38.201 .. .. a1.txt a2.txt a3.txt a4.txt b1.txt b2.txt b3.txt b4.txt c1.txt c2.txt c3.txt c4.txt
El primer comando cat, expande mensajes.1, mensajes.2 y mensajes.3 y muestra el contenido. y en la siguiente declaración de eco, las secuencias de caracteres y números enteros se combinan y utilizan.
Secuencias con valor de incremento
En la expansión de llaves kshell, puede usar el valor de incremento para generar las secuencias.
Syntax: <start>..<end>..<incr>
incr es numérico. Puede usar un número entero negativo, pero el signo correcto se deduce del orden de inicio y fin.
5. Ejemplo para usar Incremento en secuencias
$ ksh $ echo /var/log/messages.{1..7..2} /var/log/messages.1 /var/log/messages.3 /var/log/messages.5 /var/log/messages.7 $
Al usar esto, puede ver los archivos de registro de días alternos.
Error en la expansión de Brace
La expansión de llaves no expande las variables bash, porque la expansión de llaves es el primer paso de la expansión de shell, la variable se expandirá más adelante.
6. Ejemplo de Variables en expansión
Si ve el resultado de las siguientes dos declaraciones for, podría identificar el escollo anterior.
$ cat var_seq.sh # Print 1 to 4 using sequences. for i in {1..4} do echo $i done start=1 end=4 # Print 1 to 4 using through variables echo "Sequences expressed using variables" for i in {$start..$end} do echo $i done $ ./var_seq.sh 1 2 3 4 Sequences expressed using variables {1..4}