Introducción a Bash Scripting

28 de Agosto de 2023 - ed. hace: 11 meses, 3 semanas


Introducción al scripting con Bash. Variables, lógica básica, y funciones para iniciar en este fascinante lenguaje que nos permite automatizar tareas repetitivas o incluso crear la funcionalidad que sea, sumando las prestaciones de otras aplicaciones


¿Que es scripting?

Un script es un programa que es usado para manipular, personalizar y automatizar características y funcionalidad de un sistema.

Los lenguajes de scripting son usualmente interpretados en tiempo de ejecución, y permiten se combinados con otros programas. Los entornos que pueden ser automatizados a travéz de scripts incluyen aplicaciones, editores de texto, páginas web, sistemas integrados, video juegos, entre otros.

Un script es un pequeño programa, usualmente de no mas de un archivo, con no mas de unas pocas miles de lineas de código.

Algunos lenguajes utilizados para scripting son:

  • AWK
  • Bash
  • Python
  • JavaScript
  • Lua
  • Sed

Estos son por lo general rápidos de aprender y de fácil aplicación, ya sea para pequeños trozos de código o scripts interactivos (read-eval-print loop). Esto implica por lo gerenal una sintaxis y semantica simple.


Bash in 100 Seconds


Variables

$ representa una variable

mivar='hola'
mivar2='compañero'

echo $mivar $mivar2
echo ${mivar}
echo "${mivar} ${mivar2}s!"

\ escape de caracteres especiales

    {   }   [   ]   (   )   <   >
    /   \   "   ?   *   ;   `   #
    |   ~   ^   =   &   $   ! 
echo \${mivar}

Funciones

mi_func(){
    mivar='funcion 1'
    echo "${mivar}"
}

Ambito de variables

name="${USER}"

local_var() {
    local name="Rojelia"
    return
}

local_var

echo "$name"

if

Es mivar una variable?

if [ -v mivar ]; then
    echo "'mivar' es una variable"
else
    echo "'mivar' no es una variable"
fi

Comparación de valor de variable con string

if [  "${mivar}" = "hola" ]; then
    echo "'mivar' es 'hola'"
else
    echo "'mivar' no es 'hola'"
fi

Validando si existe un archivo -f

if [ -f ~/.bashrc ]; then
    echo "El archivo '.bashrc' existe en ${HOME}"
else
    echo "El archivo '.bashrc' no existe en ${HOME}"
fi
if [ -f ~/.bash_aliases ]; then
    echo "Ya tienes tu archivo de alias"
else
    echo "Tienes pendiente crear tus alias, ¿Que esperas?"
fi

array

declare -a mi_array=(cero uno dos tres cuatro)

echo "${#mi_array[@]}"
echo "${mi_array[2]}"

mi_array[2]=DOS
echo "${mi_array[2]}"

for

# recorrer secuencia
for var in $(seq 5); do
    echo "${var}"
done

for var in {1..5}; do
    echo "${var}"
done

for((i=0; i < 5; i++)); do
    echo $i
done

# recorrer array
for var in ${mi_array[@]}; do
    echo "valor: ${var}"
done

for (( i = 0; i < ${#mi_array[@]}; i++ )); do
    echo "indice: ${i} | valor: ${mi_array[${i}]}"
done


# recorrer directorios
for var in */; do
    echo "${var}"
done

while

var_control=0
while [ $var_control -lt 5 ]; do
    echo "$((var_control++))"
done

case

mi_case(){
  case $1 in
    1)
      echo "opcion 1"
      ;;
    2)
      echo "opcion 2"
      ;;
    3)
      echo "opcion 3"
      ;;
    *)
      echo "opcion desconocida"
      ;;
  esac
}

mi_case 1
mi_case 2
mi_case 3
mi_case f

Operaciones aritméticas

# suma
echo "$((6+4))"
mivar=1
echo "$((++mivar))"

# resta
echo "$((6-4))"
echo "$((--mivar))"

# mutiplicación
echo "$((6*4))"

# división entera
echo "$((6/4))"

# modulo o resto
echo "$((6%4))"

# exponencial
echo "$((10**2))"

Test

Evalua si una expresión es verdadera, puede evaluar archivos, directorios y variables. Retorna 0 si la condición se evalua como verdadera, o 1 si es falsa

Operador Descripción
&& Y lógigo
|| O lógico
# Mayor que
[[ 8 -gt 7 ]] && echo "Verdadero" || echo "Falso"

# Menor que
[[ 8 -lt 7 ]] && echo "Verdadero" || echo "Falso"

# Igual que
[[ 8 -eq 8 ]] && echo "Verdadero" || echo "Falso"
[[ "ocho" = "ocho" ]] && echo "Verdadero" || echo "Falso"

# Distinto que
[[ "ocho" != "ocho" ]] && echo "Verdadero" || echo "Falso"

Mas información man test

Evaluación aritmética

read -p "Ingresa un número :" num

if ((num == 10)); then
    echo "El número es egual a 10"
elif ((num > 10)); then
    echo "El número $num es mayor que 10"
else
    echo "El número $num es menor que 10"
fi

Sustituciones

  • Sustitución de variables:
    • Sustituye la variable por el valor que representa
  • Sustitución de expansion aritmética:
    • Sustituye la expansión arimética por el resultado de esta.
  • Sustitución de comando:
    • Sustituye la expresión por la salida del programa de la expresión.
echo "${EDITOR} $USER $((2+2)) $(date +%Y)"

Comillas simples ' ' impiden cualquier substitution

echo '${EDITOR} $USER $((2+2)) $(date +%Y)'

Brace expansion

echo Numero_{1..5}
# Numero_1 Numero_2 Numero_3 Numero_4 Numero_5

echo Numero_{5..1}
# Numero_5 Numero_4 Numero_3 Numero_2 Numero_1

echo {a..z}
# 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 z

echo {z..a}
# z y x w v u t s r q p o n m l k j i h g f e d c b a

echo {01..09}
# 01 02 03 04 05 06 07 08 09

echo {090..100}
# 090 091 092 093 094 095 096 097 098 099 100

Comportamiento similar con printf

printf 'Saludos & Felicitaciones %s!\n' "Juana"  "Roberto"
# Saludos & Felicitaciones Juana!
# Saludos & Felicitaciones Roberto!

Nested brace expansion

echo a{A{1,2},B{3,4}}b
# aA1b aA2b aB3b aB4b

Crear un directorio por mes, desde el 2023 al 2025

mkdir {2023..2025}-{01..12}

Entrada de usuario

La entrada de usuario en bash, es asignada por defecto al la variable $REPLY, esta es reemplazada al agregar una variable despues de un texto que explique la solicitud.

read -p <texto> [variable]

read -p "Ingresa tu nombre:"
echo "${REPLY}"

read -p "Ingresa tu nombre:" RESP
echo "${RESP}"
while :; do
    read -p "Ingresa tu edad: " EDAD
    case ${EDAD} in
        [1-9]|1[0-7])
            echo "Menor de edad"
            ;;
        1[8-9]|[2-5][0-9])
            echo "Mayor de edad"
            ;;
        [6-9][0-9])
            echo "Tercera Edad"
            ;;
        1[0-2][0-9])
            echo "WoW!!"
            ;;
        salir)
            break
            ;;
        *)
            echo "Ingresa una edad válida"
            ;;
    esac
done


Creación de script

Un script es un archivo de texto, con o sin extensión, ejecutable, donde incluye como primera linea un shebang, el cual indíca a bash que binario va a ejecutar el script

#!/bin/bash

La ventaja de usar env es que este usa las configuraciones del entorno desde donde se está ejecutando

#!/usr/bin/env bash
#!/usr/bin/env python

El shebang nos ahorra tener que especificar el programa que va a ejectuar el script al momento de llamarlo

# sin shebang, no requiere ser ejecutable
bash mi_script_bash
python mi_script_python

# con shebang, requiere ser ejecutable
./mi_script_bash
./mi_script_python

Creando el primer script

echo '#!/usr/bin/env bash' > mi_script
echo 'echo "hola ${USER}"' >> mi_script

Hacerlo ejecutable

chmod +x mi_script

Correr el script

./mi_script

Pasando argumentos al script

#!/usr/bin/env bash

echo "Cantidad de argumentos: $#"

while [[ $# -gt 0 ]]; do
    echo "${1}"
    shift
done

echo "Cantidad de argumentos: $#"
./mi_script arg1 arg2 arg3

Esta es la continuación de:
- Introducción a la Terminal con Bash pt. 1
- Introducción a la Terminal con Bash pt. 2



  • Categoría(s):
  • Automatización
  • -
  • Desarrollo
  • -
  • Herramientas

  • Volver al blog