Condicional
if (CONDICION); then
(BLOQUE DE COMANDOS)
else
(BLOQUE DE COMANDOS)
fi
Este comando evalúa expresión, y si evalúa a cierto, devuelve cero (true), o en otro caso 1 (false). Si no hay expresión, test siempre devuelve falso.
#!/bin/bash
# Recibe un parámetro y dice que tipo es
if test -e $1; then
echo "Has introducido un fichero";
else
echo "No es un fichero";
fi
if test -d $1; then
echo "Has introducido un directorio";
else
echo "No es un directorio"
fi
Este comando evalúa expresión, y si evalúa a cierto, devuelve cero (true), o en otro caso 1 (false). Si no hay expresión, test siempre devuelve falso. test soporta gran cantidad de operadores, algunos son:
| Expresión | Definición |
|---|---|
| -d fichero | cierto si fichero existe y es un directorio |
| -e fichero | cierto si fichero existe, independientemente del tipo que sea |
| -f fichero | cierto si fichero existe y es un fichero normal |
| -r fichero | cierto si fichero existe y se puede leer |
| -s fichero | cierto si fichero existe y tiene tamaño mayor que cero |
| -w fichero | cierto si fichero existe y es se puede escribir sobre él |
| -x fichero | cierto si fichero existe y es ejecutable |
| n1 -eq n2 | cierto si los enteros n1 y n2 son iguales |
| n1 -ne n2 | cierto si los enteros n1 y n2 no son iguales |
| n1 -gt n2 | cierto si el enteros n1 es mayor que n2 |
| n1 -ge n2 | cierto si los enteros n1 y n2 son iguales o n1 es mayor que n2 |
| n1 -lt n2 | cierto si el enteros n1 es menor que n2 |
| n1 -le n2 | cierto si los enteros n1 y n2 son iguales o n1 es menor que n2 |
| s1 = s2 | cierto si las cadenas de texto s1 y s2 son idénticas |
| s1 != s2 | cierto si las cadenas de texto s1 y s2 no son idénticas |
| s1 < s2 | cierto si la cadena de texto s1 es menor que s2 |
| s1 > s2 | cierto si la cadena de texto s1 es mayor que s2 |
| -n cadena | cierto si la longitud de la cadena de texto es distinta de cero |
| ! expresion | cierto si expresión es falsa (negación) |
| expresion1 -a expresion2 | cierto si expresion1 y expresion2 son ciertas |
| expresion1 -o expresion2 | cierto si expresion1 o expresion2 son ciertas |
Ejemplo:
#! /bin/bash
# Dado el numero, indicar si es o no divisible entre 20. Si no se mete un número debe mostrar como usar el programa
read n1;
if test -n "$n1"; then
if test $(($n1%20)) -eq 0; then
echo Divisible;
else
echo No divisible;
fi
else
echo Introduce un numero;
fi
Bucle
for (VARIABLE) in (SERIE); do
(BLOQUE DE COMANDOS)
done
En cada iteración la variable VARIABLE toma un valor de SERIE, que en caso de no contener elementos hará que no se ejecute nada y se devuelva un valor 0.
#!/bin/bash for var in 1 2 3 4 5 6 7 8 9; do echo $var done # Usando el comando seq for var in $(seq 1 9); do echo $var done # Con texto for pal in uno dos tres cuatro cinco; do echo $pal done
Ejemplos:
#!/bin/bash
# Borrar usuarios con IDs entre dos números recibidos por parámetro
for i in $(seq $1 $2); do
nombre=$(cut -d":" -f1,3 /etc/passwd | grep "\b$i\b" | cut -d":" -f1);
$(userdel -r $nombre);
done;
#!/bin/bash
echo "Nombres de los usuarios y sus grupos";
nombre_usuario=$(who | cut -d" " -f1 | sort | uniq);
for i in $nombre_usuario; do
gid=$(grep "\b$i\b" /etc/passwd | cut -d":" -f4);
grupo=$(cut -d":" -f1,3 /etc/group | grep "\b$gid\b" | cut -d":" -f1);
echo "El usuario es $i y su grupo es $grupo";
done;
#!/bin/bash
echo "Ficheros del directorio actual y su tamaño";
ficheros=$(find -type f);
for i in $ficheros;do
num_lineas=$(wc -l $i | cut -d" " -f1);
echo "Nombre del fichero: $i";
echo "Contiene $num_lineas lineas";
echo " ";
done;

