Hoja de trucos para Bash Scripting

Advertisements

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.

Advertisements

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 strings s1 y s2 son iguales.
  • s1 != s2:True, Si los strings s1 y s2 no son iguales.

Numbers

  • n1 -eq n2: True, Si los enteros n1 y n2 son algebraicamente iguales.
  • n1 -ne n2: True, Si los enteros n1 y n2 no son algebraicamente iguales.
  • n1 -gt n2: True, Si el entero n1 es algebraicamente mayor que el entero n2.
  • n1 -ge n2: True, Si el entero n1 es algebraicamente mayor o igual al entero n2.
  • n1 -lt n2: True, Si el entero n1 es algebraicamente mejor que el entero n2.
  • n1 -le n2: True, Si el entero n1 es algebraicamente mejor o igual al entero n2.

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

Advertisements

Leave a Reply

Your email address will not be published. Required fields are marked *