Cordiales Saludos
Las expansiones las hemos tratados de una manera básica en varias publicaciones. Creo conveniente poner un poco de orden y estructurarlas mejor para ver el potencial de éstas.
Expansión con llaves
A continuación veamos lo que podemos hacer por medio de las expansiones con llaves. De este grupo ya habíamos visto: {a..f} y {1..5}
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo a{x,y,z}
ax ay az
rafael@HP:~/ir_bash$ echo {x,y,z}a
xa ya za
rafael@HP:~/ir_bash$ echo {x,y,z}
x y z
rafael@HP:~/ir_bash$ echo {a..f}
a b c d e f
rafael@HP:~/ir_bash$ echo {1..5}
1 2 3 4 5
rafael@HP:~/ir_bash$
Utilidad
Para comprender mejor el uso de de las expansiones con llaves veamos un ejemplo. Aquí visualizo el contenido de los script_1.sh y script_2.sh.
rafael@HP:~/ir_bash$ cat script_{1..2}.sh
#!/bin/bash
# Concatenando variables
echo "Script Saludo"
VAR1='Hola'
VAR2='Mundo'
VAR3="${VAR1} ${VAR2}"
echo "${VAR3}"
#!/bin/bash
# HOSTNAME USER HOME
echo 'HOSTNAME: ' $HOSTNAME
echo 'USER: ' $USER
echo 'HOME: ' $HOME
rafael@HP:~/ir_bash$
Y en este caso se listan los scripts del 1 al 5.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo script_{1..5}.sh
script_1.sh script_2.sh script_3.sh script_4.sh script_5.sh
rafael@HP:~/ir_bash$
Expansion con llaves anidadas
Este tipo de expansiones con llaves permiten colocar llaves dentro de otras llaves. El límite es la imaginación o lo que queramos expandir.
rafael@HP:~/ir_bash$ echo a{q{1,2,3},x{10,20,30}}
aq1 aq2 aq3 ax10 ax20 ax30
rafael@HP:~/ir_bash$ echo a{q{1,2,3},x{10,20,30}}z
aq1z aq2z aq3z ax10z ax20z ax30z
rafael@HP:~/ir_bash$ echo {q{1,2,3},x{10,20,30}}z
q1z q2z q3z x10z x20z x30z
rafael@HP:~/ir_bash$
Expansión - Sustitución de comandos
Esta parte ya la habíamos visto en una publicación anterior. Esta forma es de mucha utilidad cuando hacemos los scripts en Bash.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $(date)
vie 10 nov 2023 12:24:54 -05
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $(who)
rafael tty2 2023-11-10 09:53 (tty2)
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$
Expansión con el comodín *
Normalmente el asterisco siempre será la referencia para Todos, de algo. Es un comodín muy utilizado.
rafael@HP:~/ir_bash$ echo *
documento.txt hola.txt ir_al_script26 primero.sh README.md script_10.sh script_11.sh script_12a.sh script_12.sh script_13.sh script_14.sh script_15.sh script_16.sh script_17.sh script_18.sh script_19.sh script_1.sh script_20.sh script_21.sh script_22.sh script_23.sh script_24a.sh script_24.sh script_25.sh script_26.sh script_27.sh script_28.sh script_29.sh script_2.sh script_30.sh script_31.sh script_32.sh script_33.sh script_34.sh script_35.sh script_36.sh script_37.sh script_38.sh script_39.sh script_3.sh script_40.sh script_41.sh script_42.sh script_43.sh script_44.sh script_45.sh script_46.sh script_47.sh script_48.sh script_49.sh script_4.sh script_50.sh script_51.sh script_52.sh script_53.sh script_54.sh script_55.sh script_56.sh script_57.sh script_58.sh script_59.sh script_5.sh script_60.sh script_61.sh script_62.sh script_63.sh script_64.sh script_65a.sh script_65.sh script_66a.sh script_66.sh script_67a.sh script_67.sh script_68a.sh script_68.sh script_69.sh script_6.sh script_70.sh script_71.sh script_72.sh script_73.sh script_7.sh script_8.sh script_9.sh test vacio.txt
rafael@HP:~/ir_bash$
Expansion de nombre de archivo
Para este ejercicio crearé tres directorios. Como verás a continuación también uso las llaves para crear los tres directorios. Te invito a crear 10 directorios como ejercicio utilizando las llaves de expansión.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ mkdir {Dir_x,Dir_y,Dir_z}
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ tree -d
.
├── Dir_x
├── Dir_y
├── Dir_z
└── test
4 directories
rafael@HP:~/ir_bash$
Aquí uso el comodín * (asterisco) para mostrar todos los Directorios.
rafael@HP:~/ir_bash$ dir D*
Dir_x:
Dir_y:
Dir_z:
rafael@HP:~/ir_bash$
Expansión aritmética
Este tipo de expansión ya la habíamos visto en una publicación anterior.
rafael@HP:~/ir_bash$ echo $(( 6 + 10 ))
16
rafael@HP:~/ir_bash$ echo $(( 60 - 10 ))
50
rafael@HP:~/ir_bash$
Expansión de subcadenas
También llamado tratamiento de cadenas o string. Crearemos una cadena de caracteres para este ejercicio: cadena=123456789.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ cadena=123456789
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $cadena
123456789
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$
Podemos rebanar o subdividir una cadena en subcadenas. Para entenderlo mejor te invito a que practiques con el siguiente ejercicio.
rafael@HP:~/ir_bash$ cadena=123456789
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $cadena
123456789
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo ${cadena:5}
6789
rafael@HP:~/ir_bash$ echo $cadena
123456789
rafael@HP:~/ir_bash$ echo ${cadena:5:3}
678
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$
Aquí vemos, que al utilizar números negativos el tratamiento de la cadena viene desde la última posición. Se cuentan las posiciones de derecha a izquierda.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $cadena
123456789
rafael@HP:~/ir_bash$ echo ${cadena: -2}
89
rafael@HP:~/ir_bash$ echo ${cadena: -6}
456789
rafael@HP:~/ir_bash$
En estos ejercicios revisa que podemos trabajar con cadenas de caracteres (strings): nombre='Rafael'. Aquí la mayor utilidad dentro de los scripts de bash.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $cadena
123456789
rafael@HP:~/ir_bash$ echo ${cadena:3:5}
45678
rafael@HP:~/ir_bash$ nombre='Rafael'
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo ${nombre:2:3}
fae
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$
También podemos trabajar con listas.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ lista=(1 2 3 4 5 6 7 8)
rafael@HP:~/ir_bash$ echo ${lista[@]}
1 2 3 4 5 6 7 8
rafael@HP:~/ir_bash$ echo ${lista[@]:4}
5 6 7 8
rafael@HP:~/ir_bash$ echo ${lista[@]: -2}
7 8
rafael@HP:~/ir_bash$
Importante: La sustitución de comandos la podemos hacer con comillas invertidas. Esta opción la podemos implementar.
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo $(date)
vie 10 nov 2023 12:55:30 -05
rafael@HP:~/ir_bash$ echo `date`
vie 10 nov 2023 12:55:41 -05
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ echo date
date
rafael@HP:~/ir_bash$ date
vie 10 nov 2023 12:55:59 -05
rafael@HP:~/ir_bash$
Veremos mejor el ejercicio anterior con esta captura.
Para finalizar, veamos el problema que se está presentando. El directorio donde tengo los ejercicios de bash esta creciendo a medida que se realizan los scripts. Se me ocurren dos formas de solucionar esta problemática.
Primero moviendo los scripts el 1 al 60 a un nuevo directorio. y como veremos el resultado el directorio de los ejercicios de bash se reducen, donde próximamente podré pasar los ejercicios desde el 61 hasta el 100 a un nuevo directorio. Para mover los archivos utilicé la expansión con llaves: {1..60}.
Para ver la otra forma de solucionar el problema , volvamos al original. Para mover los archivos utilicé la expansión con llaves: {1..60}.
Otra soluciones es llevar todo los scripts (del 1 al 60 a un nuevo documento .txt). Aquí también usé la expansión con llaves: {1..60}.
rafael@HP:~/ir_bash$ cat ejercicios_1_al_60.txt | less
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ head ejercicios_1_al_60.txt
#!/bin/bash
# Concatenando variables
echo "Script Saludo"
VAR1='Hola'
VAR2='Mundo'
VAR3="${VAR1} ${VAR2}"
echo "${VAR3}"
#!/bin/bash
# HOSTNAME USER HOME
rafael@HP:~/ir_bash$
rafael@HP:~/ir_bash$ tail ejercicios_1_al_60.txt
done
#...................................
#!/bin/bash
# script_60.sh Por: Rafael Aquino
# Entrada de datos por teclado
echo "Introduce por teclado un color"
read color
echo "Ingresaste el color: $color"
#...................................
rafael@HP:~/ir_bash$
Todos a practicar, incluyéndome! Nos vemos en la próxima publicación...
Para revisar las publicaciones anteriores de este curso: https://siraquino.github.io/pythoncumanes/linux.html
--- AVISO: Es importante que nuestra información personal (documentos, imágenes, fotos, etc) estén respaldadas en otro medio físico o en la nube. No solamente porque estemos haciendo este curso sino como práctica diaria.---
Thanks for your contribution to the STEMsocial community. Feel free to join us on discord to get to know the rest of us!
Please consider delegating to the @stemsocial account (85% of the curation rewards are returned).
You may also include @stemsocial as a beneficiary of the rewards of this post to get a stronger support.