Bash scripting
Folder with scripts
This notebook has been automatically translated to make it accessible to more people, please let me know if you see any typos.
To make this post we are going to create a folder where we are going to save all the scripts
!mkdir scripts_bash
First script
Specification of the execution binary
In linux you can indicate with which program to execute a file by putting in the first line #!<binary path>
, for example, if we create a .py
we can indicate that it has to be executed with python by putting in the first line #!/usr/bin/python3
. In our case, as we are making a terminal script we put in the first line #!/bin/bash
.
Now if the file is given execute permissions, it can be executed directly without specifying the program with which it has to be executed. That is, the .py
no longer needs to be executed via python script.py
, but can be executed via .script.py
. In our case, instead of running the file via bash script.sh
we can run it via ./script.sh
.
Comments in bash scripts
If we want to enter a comment it would be enough to start the line with #
.
# This is a one-line comment
If we want to enter several lines of comments we have to start with : '
and end with '
.
: '
This is a multi-line commentary
which extends across several lines.
Print on the screen with the command echo
.
If we want to print on the screen we use the command echo
followed by what we want to print.
!mkdir scripts_bash%%writefile scripts_bash/01_primerScript.sh#!/bin/bash# Comentario de una sola linea: 'Comentario de variaslineas'echo "Hola mundo"
Writing scripts_bash/01_primerScript.sh
We give execution permissions and run the script
!chmod +x scripts_bash/01_primerScript.sh && ./scripts_bash/01_primerScript.sh
Hola mundo
Variable declaration
There are two types of variables, user variables
and environment variables
.
To create a variable just declare it by entering the name you want, followed by =
and the value
To print the value of a variable with echo
, you have to reference it by `$
echo "Variable = $<variable name>" echo "Variable = $<variable name>
%%writefile scripts_bash/02_variables.sh#!/bin/bashopcion=1nombre="Juan"echo "Opcion: $opcion"echo "Nombre: $nombre"
Writing scripts_bash/02_variables.sh
!chmod +x scripts_bash/02_variables.sh && ./scripts_bash/02_variables.sh
Opcion: 1Nombre: Juan
Scope of variables
The variables created are only accessible from within the script, i.e., their scope is within the script.
Export of variables
We can export variables so that they can be accessed by other scripts, to do this we first export the variable using the export
command and execute call, inside the script, the second script to which we want to pass the variable to
%%writefile scripts_bash/02_variables.sh#!/bin/bashopcion=1nombre="Juan"echo "Opcion: $opcion"echo "Nombre: $nombre"# Exportar variable nombreecho "export nombre=$nombre"export nombre# Ejecutar script de importacionecho ""echo "Ejecutando script de importacion"./scripts_bash/02_variables_importacion.sh
Overwriting scripts_bash/02_variables.sh
%%writefile scripts_bash/02_variables_importacion.sh#!/bin/bashecho "Nombre importado: $nombre"
Writing scripts_bash/02_variables_importacion.sh
!chmod +x scripts_bash/02_variables.sh && chmod +x scripts_bash/02_variables_importacion.sh && ./scripts_bash/02_variables.sh
Opcion: 1Nombre: Juanexport nombre=JuanEjecutando script de importacionNombre importado: Juan
The second script has to be executed inside the first script. If we now execute the second script we do not have the variable
!chmod +x scripts_bash/02_variables_importacion.sh && ./scripts_bash/02_variables_importacion.sh
Nombre importado:
If we want it to be accessible from any second script, without having to run it inside the first scritp, we have to export the variable to an environment variable
Types of operators
All possible operators are shown below
%%writefile scripts_bash/03_operadores.sh#!/bin/bash# Asignación de variablesx=10y=20echo "x = $x"echo "y = $y"# Operadores aritméticosecho ""echo "Operadores aritméticos"echo "x + y = $((x + y))"echo "x - y = $((x - y))"echo "x * y = $((x * y))"echo "x / y = $((x / y))"echo "x % y = $((x % y))"# Operadores de comparaciónecho ""echo "Operadores de comparación"if [ "$x" -eq "$y" ]; thenecho "x es igual a y"elseecho "x no es igual a y"fiif [ "$x" -ne "$y" ]; thenecho "x no es igual a y"elseecho "x es igual a y"fiif [ "$x" -lt "$y" ]; thenecho "x es menor que y"elseecho "x no es menor que y"fiif [ "$x" -gt "$y" ]; thenecho "x es mayor que y"elseecho "x no es mayor que y"fi# Operadores de cadenaecho ""echo "Operadores de cadena"if [ "$a" = "$b" ]; thenecho "a es igual a b"elseecho "a no es igual a b"fiif [ "$a" != "$b" ]; thenecho "a no es igual a b"elseecho "a es igual a b"fiif [ -z "$a" ]; thenecho "a es una cadena vacía"elseecho "a no es una cadena vacía"fiif [ -n "$a" ]; thenecho "a no es una cadena vacía"elseecho "a es una cadena vacía"fi# Operadores de archivoecho ""echo "Operadores de archivo"if [ -e "/path/to/file" ]; thenecho "El archivo existe"elseecho "El archivo no existe"fiif [ -f "/path/to/file" ]; thenecho "Es un archivo regular"elseecho "No es un archivo regular"fiif [ -d "/path/to/dir" ]; thenecho "Es un directorio"elseecho "No es un directorio"fi
Overwriting scripts_bash/03_operadores.sh
!chmod +x scripts_bash/03_operadores.sh && ./scripts_bash/03_operadores.sh
x = 10y = 20Operadores aritméticosx + y = 30x - y = -10x * y = 200x / y = 0x % y = 10Operadores de comparaciónx no es igual a yx no es igual a yx es menor que yx no es mayor que yOperadores de cadenaa es igual a ba es igual a ba es una cadena vacíaa es una cadena vacíaOperadores de archivoEl archivo no existeNo es un archivo regularNo es un directorio
Arguments step
Arguments can be passed to the scripts, once inside the script we can make use of them as follows
- By argument number: in this case they will be named as
$1
,$2
, etc. But in case the number of arguments is greater than 9, that is to say that more than 2 digits are needed to name it, in this case the number will be identified between braces,$1
,$2
, ..., $10, $11, etc. - If the $0 argument is called, we are getting the file name.
- If we want all the arguments we do it with
$*
. - If what we want is the number of arguments we have, we obtain it by means of
$#
. - If we want to saner the output of the last command, we can know it by
$?
. - If we want to know the
PID
of the script, we can know it through$$
. - We can replace the value of a string in an argument by
${<argument index>/string to be replaced/new string}
, i.e. if we have${1/hello/hello}
it will replace the wordhello
with the wordhello
in argument 1. - However, if we use
${<argument index>/#string to be replaced/new string}
, it will only replace the string in the argument if this argument starts with that string.
%%writefile scripts_bash/04_argumentos.sh#!/bin/bash# Pasos de argumentos simplesecho "Primer argumento: $1"echo "Segundo argumento: $2"echo "Tercer argumento: $3"# Accediendo a todos los argumentosecho "Todos los argumentos: $*"# Accediendo al número de argumentosecho "Número de argumentos: $#"# Accediendo al nombre del scriptecho "Nombre del script: $0"# Accediendo al código de salida del último comando ejecutadoecho "Código de salida del último comando: $?"# Accediendo al PID del scriptecho "PID del script: $$"# Accediendo a los argumentos con índicesecho "Argumento 3: ${3}"echo "Argumento 2: ${2}"# Accediendo a los argumentos con índices y longitud máximaecho "Argumento 3 con longitud máxima de 2 caracteres: ${3:0:2}"echo "Argumento 2 con longitud máxima de 3 caracteres: ${2:0:3}"# Reemplazando argumentos con índices y longitud máximaecho "Reemplazando argumento 3: ${3/arg/ARG}"echo "Reemplazando argumento 2: $ {2/arg/ARG}"# Accediendo a los argumentos con índices y patrones de reemplazoecho "Reemplazando patrón en argumento 3: ${3/#tercer/TERCER}"echo "Reemplazando patrón en argumento 2: ${2/#arg/ARG}"
Overwriting scripts_bash/04_argumentos.sh
!arg1="primer argumento" && arg2="segundo argumento" && arg3="tercer argumento" && chmod +x scripts_bash/04_argumentos.sh && ./scripts_bash/04_argumentos.sh "$arg1" "$arg2" "$arg3"
Primer argumento: primer argumentoSegundo argumento: segundo argumentoTercer argumento: tercer argumentoTodos los argumentos: primer argumento segundo argumento tercer argumentoNúmero de argumentos: 3Nombre del script: ./scripts_bash/04_argumentos.shCódigo de salida del último comando: 0PID del script: 11644Argumento 3: tercer argumentoArgumento 2: segundo argumentoArgumento 3 con longitud máxima de 2 caracteres: teArgumento 2 con longitud máxima de 3 caracteres: segReemplazando argumento 3: tercer ARGumentoReemplazando argumento 2: segundo ARGumentoReemplazando patrón en argumento 3: tercer argumentoReemplazando patrón en argumento 2: segundo argumento
Execute commands and save them in a variable
We have two ways of executing a command and saving its output in a variable
- Through variable=
command
- Through
variable=$$(command)
.
%%writefile scripts_bash/05_variables_comandos.sh#!/bin/bashpath=$(pwd)infokernel=`uname -a`echo "El directorio actual es: $path"echo "La información del kernel es: $infokernel"
Overwriting scripts_bash/05_variables_comandos.sh
!chmod +x scripts_bash/05_variables_comandos.sh && ./scripts_bash/05_variables_comandos.sh
El directorio actual es: /home/wallabot/Documentos/web/portafolio/postsLa información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Debugging
There are two ways to be able to debug in bash scripting
- Using
-v
: Detailed line-by-line script execution - Using
-x
: Display of script information
!bash -v scripts_bash/05_variables_comandos.sh
#!/bin/bashpath=$(pwd)infokernel=`uname -a`echo "El directorio actual es: $path"El directorio actual es: /home/wallabot/Documentos/web/portafolio/postsecho "La información del kernel es: $infokernel"La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
!bash -x scripts_bash/05_variables_comandos.sh
++ pwd+ path=/home/wallabot/Documentos/web/portafolio/posts++ uname -a+ infokernel='Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux'+ echo 'El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts'El directorio actual es: /home/wallabot/Documentos/web/portafolio/posts+ echo 'La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux'La información del kernel es: Linux wallabot 5.15.0-57-generic #63~20.04.1-Ubuntu SMP Wed Nov 30 13:40:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
Obtain user information
Get information using the echo
and read
commands
We have two ways to obtain user information
- With the command
echo -n
. With the flag-n
we indicate that we do not want a line break to be printed at the end of theecho
. For example,echo -n "Enter data:"
, with this command we ask for a data and the cursor will stay on the same line, there will be no line break.
Using the read
command. With this command the program will wait for the user to enter data ending with a line break. What has been entered will be stored in the variable REPLY
. If you want the variable where the data entered by the user is saved to have another name, you must enter read [variable]
, for example the command read myVariable
, will save the user's data in the variable myVariable
.
Using the command $REPLY
or $[variable]
we access the data entered by the user.
%%writefile scripts_bash/06_leer_informacion.sh#!/bin/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "readoption=$REPLYecho ""echo -n "Ingresar un nombre: "read backupNameecho ""echo "Opción: $option, backupName: $backupName"
Overwriting scripts_bash/06_leer_informacion.sh
As in a jupyter notebook I can't enter the data as it is requested, I enter it first in a |
pipe.
!chmod +x scripts_bash/06_leer_informacion.sh && echo "1 nombreprueba" | ./scripts_bash/06_leer_informacion.sh
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1, backupName: nombreprueba
Get information only by read
command
Another way to obtain information is to use only the read
command, the syntax would be
read -p "Prompt message:" [variable].
The -p
flag indicates that the Hint prompt:
message will be displayed before waiting for the user to enter the data. If no variable name is specified, the data will be stored in the REPLY
variable.
%%writefile scripts_bash/06_leer_informacion.sh#!/bin/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "readoption1=$REPLYecho ""echo -n "Ingresar un nombre: "read backupNameecho ""read -p "Ingresar otra opción: " option2echo ""echo "Opción: $option1-$option2, backupName: $backupName"
Overwriting scripts_bash/06_leer_informacion.sh
!chmod +x scripts_bash/06_leer_informacion.sh && echo "1 nombreprueba 2" | ./scripts_bash/06_leer_informacion.sh
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1-2, backupName: nombreprueba
Validate user information
To validate the user's information it would be best to use regular expressions, here is a post where I explain them
We can also specify the number of characters we want the user to enter when using read
, for this we use the -n
flag, which, if not followed by a number, will wait until the user enters a line break, and if followed by a number, will wait until the user enters that number of characters.
%%writefile scripts_bash/07_validar_informacion.sh#!/bin/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "read -n1option1=$REPLYecho ""echo -n "Ingresar un nombre: "read -n4 backupNameecho ""read -p "Ingresar otra opción: " option2echo ""echo "Opción: $option1-$option2, backupName: $backupName"
Writing scripts_bash/07_validar_informacion.sh
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2" | ./scripts_bash/07_validar_informacion.sh
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1-2, backupName: back
If we want to enter a confidential value, such as a key, we set the -s
(security) flag. This way, when the user enters the data, it will not be printed in the console.
%%writefile scripts_bash/07_validar_informacion.sh#!/bin/bashoption=0backupName=""echo "Programa de utilidades"echo -n "Ingresar una opción: "read -n1option1=$REPLYecho ""echo -n "Ingresar un nombre: "read -n4 backupNameecho ""read -p "Ingresar otra opción: " option2echo ""read -s -p "Password: " passwordecho ""echo "Opción: $option1-$option2, backupName: $backupName, password: $password"
Overwriting scripts_bash/07_validar_informacion.sh
!chmod +x scripts_bash/07_validar_informacion.sh && echo "1back2 1234" | ./scripts_bash/07_validar_informacion.sh
Programa de utilidadesIngresar una opción:Ingresar un nombre:Opción: 1-2, backupName: back, password: 1234
If else
The way to write if
-else
conditionals is:
if [[condition]]; then
statement
elif [[condition]]; then
statement
else
statement
fi
It is important to emphasize that the conditions must be enclosed in two square brackets [[]]
.
%%writefile scripts_bash/08_if_else.sh#!/bin/bashif [[ 1 > 2 ]]; thenecho "Verdadero"elif [[ 1 > 3 ]]; thenecho "Verdadero"elseecho "Falso"fi
Overwriting scripts_bash/08_if_else.sh
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Falso
Let's see how to create nested if
s
%%writefile scripts_bash/08_if_else.sh#!/bin/bashif [[ 1 > 2 ]]; thenecho "Verdadero"elif [[ 1 > 3 ]]; thenecho "Verdadero"elseif [[ 1 > 4 ]]; thenecho "Verdadero pero falso"elseecho "Totalmente falso"fifi
Overwriting scripts_bash/08_if_else.sh
!chmod +x scripts_bash/08_if_else.sh && ./scripts_bash/08_if_else.sh
Totalmente falso
Conditional expressions
We have already seen how to create if
s, but it is necessary to explain how to create conditional expressions.
If we are going to make comparisons between strings or strings
operation | command | example | ||||
---|---|---|---|---|---|---|
greater than | `>>`` | [[[ string1 > string2 ]] | ||||
less than | < | [[[ string1 < string2 ]]` | ||||
same as | == | [[[ string1 == string2 ]]` | ||||
same as | `=`` | [[[[ string1 = string2 ]] |
empty string|-z
||[[ -z string ]]
|
|non-empty string|-n
|[[ -n string ]]
||
|||[[[ string ]]
||||
If what we are going to do is to make comparisons between numbers
operation | command | example | |
---|---|---|---|
greater than | -gt | [[[ number1 -gt number2 ]] |
greater than or equal to|-ge
||[[[ numero1 -ge numero2 ]]
||
|less than|-lt
||[[[ number1 -lt number2 ]]
||
|less than or equal to|-le
||[[[ number1 -le number2 ]]
||
|equal to|-eq
|[[[ number1 -eq number2 ]]
||
|different than|``-ne|
[[[ number1 -ne number2 ]]`||
If we want to check files or directories
operation | command | example | |||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
is a directory? | -d | [[ -d <dir> ]] | |||||||||||||
is a file? | -f | [[[ -f <file> ]] | |||||||||||||
exists? | -e | [[ -e <file> ]] or [[ -e <dir> ]] | |||||||||||||
is it readable? | -r | [[ -r <file> ]] | |||||||||||||
is it writable? | -w | [[[ -w <file> ]] | |||||||||||||
is executable? | -x | [[[ -x | |||||||||||||
is a link? | -L | [[[ -L <file> ]] | |||||||||||||
es has content? | -s | [[ -s <file> ]] | |||||||||||||
[[[ -O | |||||||||||||||
is owned by the group? | -G | [[[ -G <file> ]] | |||||||||||||
was modified? | -N | [[[ -N <file> ]] | |||||||||||||
file1 is newer than file2? | ``-nt` | [[[ <file1> -nt <file2> ]] | |||||||||||||
file1 is older than file2? | ``-ot` | [[[ <file1> -ot <file2> ]] | |||||||||||||
file1 is the same file as file2? | -ef | [[[ <file1> -ef <file2> ]] | |||||||||||||
file1 is the same file as file2? | -ef | [[[ <file1> -ef <file2> ]] |
If we want to compare joint conditions with and
, or
and not
, we need to use and
, or
and not
.
operation | command | example | |||||||
---|---|---|---|---|---|---|---|---|---|
and | `&&&`` | ``[[[ | |||||||
or | ` | ` | ``[[[ |
If we want to deny conditions
operation | command | example | |
---|---|---|---|
not | ! | [[ ! <condition> ]] |
%%writefile scripts_bash/09_condicionales.sh#!/bin/bashecho "Comparando strings"string1="hola"string2="hola"string3="chao"string4=""if [[ $string1 > $string3 ]]; thenecho "$string1 es mayor que $string3"fiif [[ $string3 < $string1 ]]; thenecho "$string3 es menor que $string1"fiif [[ $string1 == $string2 ]]; thenecho "$string1 es igual que $string2"fiif [[ $string1 != $string3 ]]; thenecho "$string1 es diferente que $string3"fiif [[ -z $string4 ]]; thenecho "$string4 es una cadena vacía"fiif [[ -n $string3 ]]; thenecho "$string3 es una cadena no vacía"fiif [[ $string3 ]]; thenecho "$string3 es una cadena no vacía"fiecho -e "\nComparando números"number1=10number2=10number3=20if [[ $number3 -gt $number1 ]]; thenecho "$number3 es mayor que $number1"fiif [[ $number3 -ge $number2 ]]; thenecho "$number3 es mayor o igual que $number2"fiif [[ $number1 -lt $number3 ]]; thenecho "$number1 es menor que $number3"fiif [[ $number1 -le $number2 ]]; thenecho "$number1 es menor o igual que $number2"fiif [[ $number1 -eq $number2 ]]; thenecho "$number1 es igual que $number2"fiif [[ $number1 -ne $number3 ]]; thenecho "$number1 es diferente que $number3"fiecho -e "\nComparando archivos"file1="$PWD/2021-02-11-Introduccion-a-Python.ipynb"file2="$PWD/scripts_bash"file3="$PWD/mi_paquete_de_python"if [[ -d $file2 ]]; thenecho "$file2 es un directorio"fiif [[ -f $file1 ]]; thenecho "$file1 es un archivo"fiif [[ -e $file1 ]]; thenecho "$file1 existe"fiif [[ -r $file1 ]]; thenecho "$file1 es legible"fiif [[ -w $file1 ]]; thenecho "$file1 es escribible"fiif [[ -x $file1 ]]; thenecho "$file1 es ejecutable"fiif [[ -L $file1 ]]; thenecho "$file1 es un link"fiif [[ -s $file1 ]]; thenecho "$file1 tiene contenido"fiif [[ -O $file1 ]]; thenecho "$file1 es propiedad del usuario"fiif [[ -G $file1 ]]; thenecho "$file1 es propiedad del grupo"fiif [[ -N $file1 ]]; thenecho "$file1 fue modificado"fiif [[ $file1 -nt $file2 ]]; thenecho "$file1 es más nuevo que $file2"fiif [[ $file1 -ot $file2 ]]; thenecho "$file1 es más viejo que $file2"fiif [[ $file1 -ef $file1 ]]; thenecho "$file1 es el mismo archivo que $file2"fiecho -e "\nComparando expresiones con AND"if [[ 2 > 1 && 3 > 1 ]]; thenecho "2 > 1 y 3 > 1"fiecho -e "\nComparando expresiones con OR"if [[ 2 > 1 || 1 > 2 ]]; thenecho "2 > 1 o 1 > 2"fiecho -e "\nComparando expresiones con NOT"if [[ ! 1 > 2 ]]; thenecho "1 > 2 no es cierto"fi
Overwriting scripts_bash/09_condicionales.sh
!chmod +x scripts_bash/09_condicionales.sh && ./scripts_bash/09_condicionales.sh
Comparando stringshola es mayor que chaochao es menor que holahola es igual que holahola es diferente que chaoes una cadena vacíachao es una cadena no vacíachao es una cadena no vacíaComparando números20 es mayor que 1020 es mayor o igual que 1010 es menor que 2010 es menor o igual que 1010 es igual que 1010 es diferente que 20Comparando archivos/home/wallabot/Documentos/web/portafolio/posts/scripts_bash es un directorio/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es un archivo/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb existe/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es legible/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es escribible/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb tiene contenido/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es propiedad del usuario/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es propiedad del grupo/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es más viejo que /home/wallabot/Documentos/web/portafolio/posts/scripts_bash/home/wallabot/Documentos/web/portafolio/posts/2021-02-11-Introduccion-a-Python.ipynb es el mismo archivo que /home/wallabot/Documentos/web/portafolio/posts/scripts_bashComparando expresiones con AND2 > 1 y 3 > 1Comparando expresiones con OR2 > 1 o 1 > 2Comparando expresiones con NOT1 > 2 no es cierto
case
statement
Next we are going to see how to write the typical switch-case
, but in this case we only use case
.
case $variable in
<value1>) <sentence1>;;
<value2>) <sentence2>;;
<value3>) <sentence3>;;
...
*) <sentence that does not meet any of the above>.
esac
%%writefile scripts_bash/10_case.sh#!/bin/bashvariable="amarillo"case $variable in"rojo") echo "Color rojo";;"verde") echo "Color verde";;"azul") echo "Color azul";;*) echo "Color desconocido";;esac
Writing scripts_bash/10_case.sh
!chmod +x scripts_bash/10_case.sh && ./scripts_bash/10_case.sh
Color desconocido
Arrays
Let's see how arrays behave in bash scripting
%%writefile scripts_bash/11_arrays.sh#!/bin/basharrayNumeros=(1 2 3 4 5)arrayStrings=("hola" "chao" "adios")arrayMixto=(1 "hola" 2 "chao" 3 "adios")arrayVacio=()arrayRango=({A..Z})echo "Arrays"echo "Array de números: ${arrayNumeros[*]}"echo "Array de strings: ${arrayStrings[*]}"echo "Array mixto: ${arrayMixto[*]}"echo "Array vacío: ${arrayVacio[*]}"echo "Array de rango: ${arrayRango[*]}"echo -e "\nAccediendo a elementos"echo "Primer elemento del array de números: ${arrayNumeros[0]}"echo "Segundo elemento del array de strings: ${arrayStrings[1]}"echo "Último elemento del array de números: ${arrayNumeros[-1]}"echo "Penúltimo elemento del array de strings: ${arrayStrings[-2]}"echo -e "\nLongitud de arrays"echo "Longitud del array de números: ${#arrayNumeros[*]}"echo "Longitud del array de strings: ${#arrayStrings[*]}"echo "Longitud del array mixto: ${#arrayMixto[*]}"echo "Longitud del array vacío: ${#arrayVacio[*]}"echo "Longitud del array de rango: ${#arrayRango[*]}"echo -e "\nAñadiendo y eliminando elementos"arrayNumeros[5]=6echo "Añadiendo elemento al array de números: ${arrayNumeros[*]}"unset arrayStrings[1]echo "Eliminando elemento del array de strings: ${arrayStrings[*]}"
Overwriting scripts_bash/11_arrays.sh
!chmod +x scripts_bash/11_arrays.sh && ./scripts_bash/11_arrays.sh
ArraysArray de números: 1 2 3 4 5Array de strings: hola chao adiosArray mixto: 1 hola 2 chao 3 adiosArray vacío:Array de rango: A B C D E F G H I J K L M N O P Q R S T U V W X Y ZAccediendo a elementosPrimer elemento del array de números: 1Segundo elemento del array de strings: chaoÚltimo elemento del array de números: 5Penúltimo elemento del array de strings: chaoLongitud de arraysLongitud del array de números: 5Longitud del array de strings: 3Longitud del array mixto: 6Longitud del array vacío: 0Longitud del array de rango: 26Añadiendo y eliminando elementosAñadiendo elemento al array de números: 1 2 3 4 5 6Eliminando elemento del array de strings: hola adios
Loop for
To use the for
loop use the following syntax
for <variable> in <array>
do
sentence
done
Let's see an example
%%writefile scripts_bash/12_for.sh#!/bin/basharrayNumeros=(1 2 3 4 5)arrayStrings=("hola" "chao" "adios")echo "Iterar a través de un array de numeros"for numero in ${arrayNumeros[*]}doecho "Número: $numero"doneecho -e "\nIterar a través de un array de strings"for string in ${arrayStrings[*]}doecho "String: $string"doneecho -e "\nIterar a través de un array no declarado"for string in "Manolo" "Juan" "Pedro"doecho "String: $string"doneecho -e "\nIterar a través de un rango"for i in {1..10}doecho "Número: $i"doneecho -e "\nIterar a través de un rango de manera clásica"for (( i=1; i<=10; i++ ))doecho "Número: $i"doneecho -e "\nIterar a través de un comando"for file in $(ls)doecho "Archivo: $file"doneecho -e "\nIterar a través de un directorio"for file in *doecho "Archivo: $file"done
Overwriting scripts_bash/12_for.sh
!chmod +x scripts_bash/12_for.sh && ./scripts_bash/12_for.sh
Iterar a través de un array de numerosNúmero: 1Número: 2Número: 3Número: 4Número: 5Iterar a través de un array de stringsString: holaString: chaoString: adiosIterar a través de un array no declaradoString: ManoloString: JuanString: PedroIterar a través de un rangoNúmero: 1Número: 2Número: 3Número: 4Número: 5Número: 6Número: 7Número: 8Número: 9Número: 10Iterar a través de un rango de manera clásicaNúmero: 1Número: 2Número: 3Número: 4Número: 5Número: 6Número: 7Número: 8Número: 9Número: 10Iterar a través de un comandoArchivo: 2021-02-11-Introduccion-a-Python.ipynbArchivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynbArchivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynbArchivo: 2022-09-12-Introduccion-a-la-terminal.ipynbArchivo: 2023-01-22-Docker.ipynbArchivo: 2023-XX-XX-Bash-scripting.ipynbArchivo: california_housing_train.csvArchivo: command-line-cheat-sheet.pdfArchivo: CSS.ipynbArchivo: ExpresionesArchivo: regulares.ipynbArchivo: html_filesArchivo: html.ipynbArchivo: introduccion_pythonArchivo: mi_paquete_de_pythonArchivo: movies.csvArchivo: movies.datArchivo: notebooks_translatedArchivo: __pycache__Archivo: scripts_bashArchivo: ssh.ipynbArchivo: test.ipynbIterar a través de un directorioArchivo: 2021-02-11-Introduccion-a-Python.ipynbArchivo: 2021-04-23-Calculo-matricial-con-Numpy.ipynbArchivo: 2021-06-15-Manejo-de-datos-con-Pandas.ipynbArchivo: 2022-09-12-Introduccion-a-la-terminal.ipynbArchivo: 2023-01-22-Docker.ipynbArchivo: 2023-XX-XX-Bash-scripting.ipynbArchivo: california_housing_train.csvArchivo: command-line-cheat-sheet.pdfArchivo: CSS.ipynbArchivo: Expresiones regulares.ipynbArchivo: html_filesArchivo: html.ipynbArchivo: introduccion_pythonArchivo: mi_paquete_de_pythonArchivo: movies.csvArchivo: movies.datArchivo: notebooks_translatedArchivo: __pycache__Archivo: scripts_bashArchivo: ssh.ipynbArchivo: test.ipynb
while
loop
To use the while
loop use the following syntax
while <condition>
do
sentence
done
Let's see an example
%%writefile scripts_bash/13_while.sh#!/bin/bashnumero=1while [ $numero -ne 5 ]doecho "Número: $numero"numero=$(( numero + 1 ))done
Overwriting scripts_bash/13_while.sh
!chmod +x scripts_bash/13_while.sh && ./scripts_bash/13_while.sh
Número: 1Número: 2Número: 3Número: 4
Flow control with break
and `continue
We can control the flow of a loop by using the words break
and continue
, let's see an example
%%writefile scripts_bash/14_control_de_flujo.sh#!/bin/bashnumero=1while [ $numero -ne 10 ]doif [ $numero -eq 5 ]; thennumero=$(( numero + 1 ))echo "Saltando el número 5"continueelif[ $numero -eq 8 ]; thenecho "Terminando el bucle"breakfiecho "Número: $numero"numero=$(( numero + 1 ))done
Overwriting scripts_bash/14_control_de_flujo.sh
!chmod +x scripts_bash/14_control_de_flujo.sh && ./scripts_bash/14_control_de_flujo.sh
Número: 1Número: 2Número: 3Número: 4Saltando el número 5Número: 6Número: 7Terminando el bucle
Functions
The syntax for writing functions is
<function name> (){
sentences
}
Here is an example
%%writefile scripts_bash/15_funciones.sh#!/bin/bashfuncion () {echo "Soy una función"}funcoionConParametros () {echo "Soy una función con parámetros"echo "Parámetro 1: $1"echo "Parámetro 2: $2"}funcionfuncoionConParametros "Hola" "Adiós"
Writing scripts_bash/15_funciones.sh
!chmod +x scripts_bash/15_funciones.sh && ./scripts_bash/15_funciones.sh
Soy una funciónSoy una función con parámetrosParámetro 1: HolaParámetro 2: Adiós