Para comparar en Bash se utiliza test o [ Ambos son totalmente equivalentes, y ambos están implementados en el propio Bash. En el caso [, por cuestiones prácticas es obligatorio también
utilizar su pareja ] o de otra forma te da error. Esta es la razón para que tenga que estar separado el corchete de la expresión que viene a continuación, porque es un comando.
Por otro lado, también puedes utilizar dobles corchetes [[, para realizar tus comparaciones. Los dobles corchetes resultan ser una mejora respecto a los simples. Así, las diferencias entre uno y otro son las siguientes,
Es posible que te preguntes por la razón para seguir utilizando [ simple corchete en lugar de doble. La cuestión es por compatibilidad. Si utilizas Bash en diferentes equipos es posible que te encuentres alguna incompatibilidad. Así que depende de ti y de donde lo vayas a utilizar. Para el curso utilizaremos los corchetes simples [
Comparaciones De Cadenas Alfanuméricas
Operador Verdad (TRUE) si: ------------------------------------------ cadena1 = cadena2 cadena1 es igual a cadena2 cadena1 != cadena2 cadena1 no es igual a cadena2 cadena1 < cadena2 cadena1 es menor que cadena2 cadena1 > cadena 2 cadena1 es mayor que cadena 2 -n cadena1 cadena1 no es igual al valor nulo (longitud mayorque 0) -z cadena1 cadena1 tiene un valor nulo (longitud 0)
Operador Verdad (TRUE) si: ------------------------------------------ x -lt y x menor que y x -le y x menor o igual que y x -eq y x igual que y x -ge y x mayor o igual que y x -gt y x mayor que y x -ne y x no igual que y
Operador Verdad (TRUE) si: ------------------------------------------ -d fichero fichero existe y es un directorio -e fichero fichero existe -f fichero fichero existe y es un fichero regular (no un directorio, u otro tipo de fichero especial) -r fichero Tienes permiso de lectura en fichero -s fichero fichero existe y no esta vacio -w fichero Tienes permiso de escritura en fichero -x fichero Tienes permiso de ejecucion en fichero (o de busqueda si es un directorio) -O fichero Eres el dueño del fichero -G fichero El grupo del fichero es igual al tuyo. fichero1 -nt fichero2 fichero1 es mas reciente que fichero2 fichero1 -ot fichero2 fichero1 es mas antiguo que fichero2
A modo de resumen, la siguiente tabla presenta los operadores utilizados en los distintos tipos de expresiones BASH.

La estructura condicional sirve para comprobar si se ejecuta un bloque de código cuando se cumple una cierta condición. Pueden anidarse varias estructuras dentro del mismo bloque de código, pero siempre existe una única palabra fi para cada bloque condicional.
La sentencia if EXPRESION, significa, Si se cumple la expresión condicional se ejecuta el bloque de sentencias seguidas.
En Bash podemos controlar qué partes de nuestro script se ejecutan usando un if. En la condición podemos usar comparaciones entre valores, expresiones complejas o el valor de salida de un programa. El formato del if puede ser implementado de las siguientes maneras:
if [ condicion1 ] then comando1 comando2 .... fi
if test var == value then comando1 comandoN fi
if [ condition ]; then comando1 comandoN fi
if test -f /file/exists then comando1 comandoN fi
NOTA: En bash el cero se toma como verdadero y un valor distinto de cero como falso.
Ejemplo: Comprobar si existe un fichero

![]()
Este script comprueba si existe el fichero fichero_prueba, en este caso se crea antes del condicional para verificar que si ingrese a la estructura de control.
La comprobación se hace a través de: -f fichero_prueba.
Ejemplo: Comparar cadenas de texto
Podemos ver si dos cadenas de texto son iguales usando el operador '==':

![]()
Ejemplo: Comparar números
Para ver si dos números son iguales usamos -eq (de equal en inglés):

![]()
Ejemplo: Negación
Si a una condición verdadera le ponemos el símbolo '!' delante se convierte en falsa. Si hacemos lo mismo con una condición falsa se convierte en verdadera. Por ejemplo
![]()
#!/bin/bash if [ "$command" == "$command2" ] then echo "Cumple la condicion" else echo "No cumple la condicion" fi
Ejemplo:
Verificar si se ingresa la contraseña correcta, si es correcta o incorrecta indicarlo por medio de un mensaje


También podemos usar el elif que nos permite comprobar si se cumplen varias condiciones. Si no se cumple la del if se comprueba la del elif, si ésta tampoco cumple se ejecuta el bloque del else:
#!/bin/bash if [ condition ] then echo "Cumple la condicion" elif [ other_condition ] then echo "Cumple la otra condicion" else echo "No cumple ninguna condicion" fi
Ejemplo


if [ condicion1 ] then ............. if [ condicion2 ] then ............ else ...... fi else ......... fi
Ejemplo


Puede vincular dos comandos en bash shell mediante la ejecución condicional basada en el estado de salida del último comando. Esto es útil para controlar la secuencia de ejecución del comando.
<< desplazamiento de 1 bit hacia la
izquierda que equivale a multiplicar por 2.
>> desplazamiento de 1 bit hacia la derecha,
que equivale a dividir por 2.
<<= desplazamiento de 2 bits hacia la izquierda
que equivale a multiplicar por 4.
>>= desplazamiento de 2 bits hacia la derecha,
que equivale a dividir por 4.
& operación and
| operación or
^ operador xor
! operador de negación (NOT)
Operadores Lógicos
El bash admite las siguientes dos ejecuciones
condicionales
es un operador booleano. Puede ejecutar comandos o funciones de shell en función del estado de salida de otro comando.
Sintaxiscomando1 && comando2
comando2 se ejecuta si, y solo si, comando1 devuelve un estado de salida de cero (verdadero). En otras palabras, ejecute comando1 y, si tiene éxito, ejecute comando2.
Ejemplo:rm /tmp/filename && echo "Archivo Eliminado."
es un operador booleano. Puede ejecutar comandos o funciones de shell en función del estado de salida de otro comando.
Sintaxiscomando1 || comando2
comando2 se ejecuta si, y solo si, comando1 devuelve un estado de salida distinto de cero. En otras palabras, ejecute comando1 con éxito o ejecute comando2.
Ejemplo:cat /etc/shadow 2>/dev/null || echo "Error al abrir el archivo"
not (!) Es un operador booleano, que se utiliza para probar si la expresión es verdadera o no. Por ejemplo, si el archivo no existe, muestre un error en la pantalla.
Sintaxis! expression
[ ! expression ]
[ ! -d /backup ] && mkdir /backup
Es una estructura de control condicional, que permite definir múltiples casos que puede llegar a cumplir una variable cualquiera, y qué acción tomar en cualquiera de estas situaciones, incluso es posible determinar qué acción llevar a cabo en caso de no cumplir ninguna de las condiciones dadas.
Las posibles opciones soportadas por la estructura selectiva múltiple se expresan mediante patrones, donde puede aparecer caracteres comodines, evaluándose como una expansión de ficheros, por lo tanto, el patrón para representar la opción por defecto es el asterisco (*). Dentro de una misma opción pueden aparecer varios patrones separados por la barra vertical (|), como en una expresión lógica O.
Si la expresión que se comprueba cumple varios patrones de la lista, sólo se ejecuta el bloque de código correspondiente al primero de ellos, ya que la evaluación de la estructura se realiza en secuencia.
case $variable_name in patron1) command1 ... .... commandN ;; patron2) command1 ... .... commandN ;; patronN) command1 ... .... commandN ;; *) commandDefault ;; esac
Ejemplo:


Los bucles son estructuras reiterativas que se ejecutan repetitivamente, para no tener que teclear varias veces un mismo bloque de código. Un bucle debe tener siempre una condición de salida para evitar errores provocados por bucles infinitos.
La siguiente tabla describe las 2 órdenes especiales que pueden utilizarse para romper el modo de operación típico de un bucle.

Utilice la instrucción break para salir de un bucle FOR, WHILE o UNTIL, es decir, detener la ejecución del bucle.
Sintaxisbreak
La instrucción continue se usa para reanudar la próxima iteración del ciclo FOR, WHILE o UNTIL que lo encierra.
Sintaxiscontinue
[ condition ] && continue
#!/bin/bash i=0 while [ $i -lt 6 ] do (( i++ )) #Incremento la variable en 1 [ $i -eq 3 -o $i -eq 6 ] && continue echo "$i" done
El bucle FOR se utiliza para repetir una o más instrucciones un determinado número de veces. De entre todos los bucles, el FOR se suele utilizar cuando sabemos seguro el número de veces que queremos que se ejecute. La sintaxis del bucle for se muestra a continuación.
for variable in lista_valores do acciones_a_realizar done
Ejemplo


Suele ser habitual el uso del comando externo seq para generar una lista de valores. Si bien este comando no está recogido en el estándar POSIX, es habitual su presencia en la mayoría de los sistemas UNIX. El comando seq presenta la sintaxis:
`seq valor_inicial valor_final`
siendo ambos valores números enteros. La salida del comando es la secuencia de números enteros entre ambos valores extremos indicados.
Nota: Debe utilizar comillas de acento grave ( `` ) antes de la palabra seq y después del límite superior de la lista que asigno.
Ejemplo


Un bucle while permite repetir la ejecución de un grupo de instrucciones mientras se cumpla una condición (es decir, mientras la condición tenga el valor True).
Sintaxis:while condicion do instrucciones done
Un ejemplo simple con while en donde imprimimos una variable y luego a este valor se le suma 2 hasta que el numero sea menor o igual que 15


Until, es una instrucción de control que sirve para generar bucles, en los cuales grupos de instrucciones dentro de un bloque se ejecutan de forma repetida hasta que se cumpla una condición.
Cabe destacar que until, primero comprobará si se cumple la condición y si se cumple y sólo si se cumple entonces finaliza la secuencia de las instrucciones contenidas entre do y done.
Cada vez que se ejecuta un bucle completo (paso de bucle) vuelve a verificar si se cumple la condición antes de volver a ejecutar otro paso de bucle.
Sintaxis:until condicion do instrucciones done
Un ejemplo simple con until en donde escribimos el valor de una variable 10 veces, después de incrementar su valor:


El bucle de selección proporciona una manera fácil de crear un menú numerado desde el cual los usuarios pueden seleccionar opciones. Es útil cuando necesita pedirle al usuario que elija uno o más elementos de una lista de opciones.
Sintaxis:
select varName in list do command1 commandN done
select varName in word1 word2 ... wordN do instrucciones done

