Los scripts bash son una herramienta muy útil para los desarrolladores, aunque normalmente tenemos nuestra preferencia por un lenguaje Java, C#, python, NodeJS, etc, hay tareas o procesos en los que no queremos gastar mucho esfuerzo en implementar ellos en ese idioma. En ese caso, probablemente, bash scripts vengan al rescate.
Como desarrollador Full Stack, a veces necesito crear scripts bash para automatizar algunos procesos: interactuar con las implementaciones, servidores y más. Por lo tanto, es importante tener a mano algún comando común en bash.
Echo
echo "Hello World"
If/fi
if [[ $? -ne 0 ]]; then ##Code here fi
- Siempre finaliza el bloque con
fi
- Agregar espacios antes y después de los paréntesis cuadrados
[[
,]]
- Agregar las instrucciones
; then
If/else/fi
number=$? if [[ $number -gt 0 ]]; then ##Code here else if [[ $number -eq 0 ]]; then ## Code here else ## Code here fi
Variables
my_var="Hello" hello="World" echo "Hi! $my_var $hello"
Métodos
my_method () { param1=${1} param2=${2} echo "$param1 $param2" } my_method "Hello" "World"
Obtener parámetros
Para obtener todos los parámetros $@
puede ser usado.
Para obtener un parámetro por su índice
param1=${1} param2=${2}
Por índice y con valor por defecto
param1=${1-null} param2=${2:-8000}
Debugging
set +x
habilita que todas las instrucciones que son ejecutadas se impriman en la consola.
set +x ## Code here set -x
set -x
(Conducta por defecto) des-habilita que las instrucciones que son ejecutadas se impriman en la consola.e.
Estas opciones son muy utiles para hacer “debugging” del script y poder ver que comandos están siendo ejecutados, determinando el flujo del script en tiempo de ejecución.
Manejo de Errores
set +e
es usado dentro de Bash para evitar detener la ejecución de manera instantanea cuando una operación termina y obtiene un estado diferente de cero.
set +e ## Code here set -e
2>/dev/null
Evita que los errores generados sean mostrados en la consola.
grep -i 'abc' content 2>/dev/null
set -u
y set +u
habilita y des-habilita las variables que por una variable no seteada el proceso genere un error y termine de forma inmediata. Variables sin setear son una causa común de errores en “shell scripts”, por lo tanto terminar la aplicación al tener una variable sin setear es una conducta normalmente deseada.
Expresiones Condicionales
Las Expresiones Condicionales son código que se agrega dentro de un if [[ condition ]]
Strings
-n string
: True, Si el largo del string es diferente de cero.-z string
: True, Si el largo del string es cero.s1 = s2
: True, Si los stringss1
ys2
son iguales.s1 != s2
:True, Si los stringss1
ys2
no son iguales.
Numbers
n1 -eq n2
: True, Si los enterosn1
yn2
son algebraicamente iguales.n1 -ne n2
: True, Si los enterosn1
yn2
no son algebraicamente iguales.n1 -gt n2
: True, Si el enteron1
es algebraicamente mayor que el enteron2
.n1 -ge n2
: True, Si el enteron1
es algebraicamente mayor o igual al enteron2
.n1 -lt n2
: True, Si el enteron1
es algebraicamente mejor que el enteron2
.n1 -le n2
: True, Si el enteron1
es algebraicamente mejor o igual al enteron2
.
Yes/No Prompt
read -p "Do you want to blah..blah..blah (y/n)?" choice case "$choice" in y|Y ) #DO here the YES logic ;; n|N ) #DO here the NO logic ;; * ) echo "Incorrect answer";; esac
Iterating folder content
parent_folder="/opt/" for dir in "$parent_folder"/*/; do echo $dir only_name="$(basename "$dir")" #basename removes leading directories echo $only_name done
Obtener parámetros en el Script
while getopts ":c:s:ha" opt; do case ${opt} in h ) #Do something when -h is indicated ;; a ) #Do something when -a is indicated ;; c ) value_c="${OPTARG}" ## Do something when -c <value_c> is indicated ;; s ) value_s="${OPTARG}" ## Do something when -s <value_c> is indicated ;;
":c:s:ha"
son las “banderas” aceptadas. Aquellas con :
después de la letra aceptan un valor como parámetro.
Operaciones con String
Substring
MY_VAR="Hello World!" MY_VAR2="${MY_VAR:0:7}" echo "$MY_VAR2" #outputs "Hello W"
Remover Caracteres
$ echo "hello, how are you?" | sed 's/h//' #Outputs "ello, how are you?" $ echo "hello, how are you?" | sed 's/h//g' #Outputs "ello, ow are you?"
Manejando resultados con AWK
awk
es un lenguaje de scripting usado para manipular datos y generar reportes.
Hay algunos identificadores de campo especiales:
- $0: Representa la linea completa del texto.
- $1: Representa el primer campo.
- $2: Representa el segundo campo.
- $7: Representa el campo en posición 7.
- $NF: Indica el “número de campos,” y a su vez representa el último campo.
MY_OUTPUT="Adam Gamboa Developer" echo "$MY_OUTPUT" | awk '{print $1,$3}' ##prints "Adam Developer"
Referencias
- https://www.geeksforgeeks.org/awk-command-unixlinux-examples/
- https://www.howtogeek.com/562941/how-to-use-the-awk-command-on-linux/
- https://linuxhint.com/bash-set-e/#:~:text=Set%20%E2%80%93e%20is%20used%20within,location%20in%20the%20running%20code.
- https://vaneyckt.io/posts/safer_bash_scripts_with_set_euxo_pipefail/