Condicionales y bucles
El control de flujo en Bash permite reaccionar a codigos de salida, comparar strings y recorrer listas o archivos.
Codigos de salida
bash
ls /existente
echo $? # 0 = exito
ls /no-existe 2>/dev/null
echo $? # distinto de 0 = errorEn scripts, set -e hace fallar el script si un comando falla (capitulo 6).
if / elif / else
bash
if [[ -f "config.yml" ]]; then
echo "Config encontrada"
elif [[ -d "config.d" ]]; then
echo "Directorio de config"
else
echo "Sin config"
exit 1
fiPreferir [[ ]] sobre [ ] en bash: mas seguro con strings y patrones.
Comparaciones numericas
bash
count=5
if (( count > 3 )); then
echo "mayor que 3"
fiComparaciones de strings
bash
env="${APP_ENV:-dev}"
if [[ "$env" == "production" ]]; then
echo "Modo prod"
fiComandos en if
bash
if grep -q "ERROR" app.log; then
echo "Hay errores"
ficase
bash
case "$1" in
start)
systemctl start myapp
;;
stop)
systemctl stop myapp
;;
restart)
systemctl restart myapp
;;
*)
echo "Uso: $0 {start|stop|restart}"
exit 1
;;
esacfor
bash
for file in *.log; do
echo "Procesando $file"
gzip "$file"
done
for i in {1..5}; do
echo "Iteracion $i"
done
for ((i=0; i<3; i++)); do
echo $i
donewhile y until
bash
while read -r line; do
echo "Linea: $line"
done < access.log
# esperar servicio
until curl -fsS http://localhost:8080/health; do
sleep 2
donebreak y continue
bash
for f in *; do
[[ "$f" == *.tmp ]] && continue
[[ "$f" == "STOP" ]] && break
process "$f"
doneOperadores de archivos
| Test | Significado |
|---|---|
-f file | Archivo regular existe |
-d dir | Directorio existe |
-r file | Legible |
-x file | Ejecutable |
-s file | No vacio |
file1 -nt file2 | file1 mas nuevo |
Buenas practicas
[[ ]]con variables entre comillas.(( ))para numeros.read -rpara no interpretar backslash.- Salir con codigo distinto de 0 en error.
- Evita bucles infinitos sin
sleepo limite.
Errores habituales
if [ $var == value ]convarvacio (syntax error); usa[[ ]].- No quotar
$fileenforcon nombres con espacios. while read linesin-r.- Confundir
=y==dentro de[ ](depende del shell). - Olvidar
;;encase.
Siguiente paso
El capitulo 4 organiza scripts con funciones reutilizables.
