Curso de Linux N24. Expansiones

Cordiales Saludos


24_portada.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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$ 


0_separa_expansiones.png

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.


24_ejerciico.png



0_separa_expansiones.png

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.


24_2.png

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}.

24_3.png

Para ver la otra forma de solucionar el problema , volvamos al original. Para mover los archivos utilicé la expansión con llaves: {1..60}.

24_4.png

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}.


24_5.png

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.---

Mi Twitter

Sort:  

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.