Control de flujo de Shell

A diferencia de lenguajes como Java, PHP, etc., el control de flujo en sh no puede estar vacío, como (lo siguiente es la sintaxis de control de flujo en PHP):

Ejemplo

<?php
if (isset($_GET["q"])) {
    search(q);
}
else {
    // no hacer nada
}

En sh/bash no se puede escribir así; si la rama else no tiene sentencias que ejecutar, entonces no escribas ese else.


if else

if

Sintaxis de la sentencia if:

if condition
then
    command1 
    command2
    ...
    commandN 
fi

Escrito en una línea (aplicable al prompt de comandos de terminal):

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

El que está al finalfiesifescrito al revés, y más adelante encontrarás casos similares.

if else

Sintaxis de if else:

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

if else-if else

Sintaxis de if else-if else:

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

de if else[...]en la sentencia condicional, para “mayor que” se usa-gt, para “menor que” se usa-lt。

if [ "$a" -gt "$b" ]; then
    ...
fi

si se usa((...))como sentencia condicional, “mayor que” y “menor que” se pueden usar directamente.>y<。

if (( a > b )); then
    ...
fi

El siguiente ejemplo determina si dos variables son iguales:

Ejemplo

a=10
b=20
if [ $a == $b ]
then
   echo "a es igual a b"
elif [ $a -gt $b ]
then
   echo "a es mayor que b"
elif [ $a -lt $b ]
then
   echo "a es menor que b"
else
   echo "No se cumple ninguna condición"
fi

Resultado de salida:

a 小于 b

Usando((...))como sentencia condicional:

Ejemplo

a=10
b=20
if (( $a == $b ))
then
   echo "a es igual a b"
elif (( $a > $b ))
then
   echo "a es mayor que b"
elif (( $a < $b ))
then
   echo "a es menor que b"
else
   echo "No se cumple ninguna condición"
fi

Resultado de salida:

a 小于 b

La sentencia if else se usa frecuentemente junto con el comando test, como se muestra a continuación:

Ejemplo

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '¡Los dos números son iguales!'
else
    echo '¡Los dos números no son iguales!'
fi

Resultado de salida:

¡Los dos números son iguales!

Bucle for

Similar a otros lenguajes de programación, Shell admite bucles for.

El formato general del bucle for es:

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

Escrito en una línea:

for var in item1 item2 ... itemN; do command1; command2… done;

Cuando el valor de la variable está en la lista, el bucle for ejecuta todos los comandos una vez, usando el nombre de la variable para obtener el valor actual en la lista. Los comandos pueden ser cualquier comando y sentencia válidos de shell. La lista in puede contener sustituciones, cadenas y nombres de archivo.

La lista in es opcional; si no se usa, el bucle for utiliza los parámetros posicionales de la línea de comandos.

Por ejemplo, mostrar secuencialmente los números en la lista actual:

Ejemplo

for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

Resultado de salida:

The value is: 1
The value is: 2
The value is: 3
The value is: 4
The value is: 5

Mostrar secuencialmente los caracteres de una cadena:

#!/bin/bash

for str in This is a string
do
    echo $str
done

Resultado de salida:

This
is
a
string

Sentencia while

El bucle while se utiliza para ejecutar continuamente una serie de comandos, y también para leer datos de un archivo de entrada. Su formato de sintaxis es:

while condition
do
    command
done

El siguiente es un bucle while básico: la condición de prueba es: si int es menor o igual que 5, entonces la condición devuelve verdadero. int comienza en 1, y en cada iteración del bucle, int se incrementa en 1. Al ejecutar el script anterior, devuelve los números del 1 al 5 y luego termina.

Ejemplo

#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

Ejecuta el script, salida:

1
2
3
4
5

El ejemplo anterior usa el comando let de Bash, que se utiliza para ejecutar una o más expresiones; en el cálculo de variables no es necesario añadir $ para representar la variable. Consulta más detalles en:Comando let de Bash

。

El bucle while se puede usar para leer información del teclado. En el siguiente ejemplo, la entrada se asigna a la variable FILM, y se presiona <Ctrl-D> para finalizar el bucle.

Ejemplo

echo 'Presiona <CTRL-D> para salir'
echo -n 'Escribe el nombre de tu sitio web favorito: '
while read FILM
do
    echo "¡Sí!$FILMes un buen sitio web"
done

Ejecuta el script, la salida es similar a lo siguiente:

按下 <CTRL-D> 退出
输入你最喜欢的网站名:Ejemplo
是的!Ejemplo 是一个好网站

Bucle infinito

Formato de sintaxis del bucle infinito:

while :
do
    command
done

o

while true
do
    command
done

o

for (( ; ; ))


Bucle until

El bucle until ejecuta una serie de comandos hasta que la condición sea true, momento en el que se detiene.

El bucle until es exactamente opuesto al bucle while en su forma de procesamiento.

En general, el bucle while es preferible al bucle until, pero en algunas ocasiones —solo en muy raros casos— el bucle until es más útil.

Sintaxis de until:

until condition
do
    command
done

condition generalmente es una expresión condicional; si el valor de retorno es false, se continúan ejecutando las sentencias dentro del cuerpo del bucle; de lo contrario, se sale del bucle.

En el siguiente ejemplo usamos el comando until para mostrar los números del 0 al 9:

Ejemplo

#!/bin/bash

a=0

until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Resultado de ejecución:

El resultado de salida es:

0
1
2
3
4
5
6
7
8
9

case ... esac

case ... esacEs una sentencia de selección múltiple, similar a la sentencia switch ... case en otros lenguajes; es una estructura de selección de múltiples ramas. Cada rama case comienza con un paréntesis derecho y usa dos punto y coma;;que representa break, es decir, fin de la ejecución y salida de toda la sentencia case ... esac; esac (que es case al revés) actúa como marcador de fin.

Se puede usar la sentencia case para hacer coincidir un valor con un patrón; si la coincidencia es exitosa, se ejecuta el comando correspondiente.

case ... esacLa sintaxis es la siguiente:

case 值 in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2)
    command1
    command2
    ...
    commandN
    ;;
esac

case funciona como se muestra arriba; después del valor debe ir la palabrain, cada patrón debe terminar con un paréntesis derecho. El valor puede ser una variable o una constante; cuando se descubre que el valor coincide con un patrón, todos los comandos en ese intervalo comienzan a ejecutarse hasta;;。

El valor detectará cada patrón que coincida. Una vez que un patrón coincide, después de ejecutar los comandos correspondientes al patrón coincidente, no se continúa con otros patrones. Si ningún patrón coincide, se usa el asterisco * para capturar ese valor y luego se ejecutan los comandos siguientes.

El siguiente script solicita ingresar un número del 1 al 4 y lo compara con cada patrón:

Ejemplo

echo 'Ingresa un número entre 1 y 4:'
echo 'El número que ingresaste es:'
read aNum
case $aNum in
    1)  echo 'Has elegido 1'
    ;;
    2)  echo 'Has elegido 2'
    ;;
    3)  echo 'Has elegido 3'
    ;;
    4)  echo 'Has elegido 4'
    ;;
    *)  echo 'No ingresaste un número entre 1 y 4'
    ;;
esac

Al ingresar diferentes contenidos, se obtendrán diferentes resultados, por ejemplo:

输入 1 到 4 之间的数字:
你输入的数字为:
3
你选择了 3

El siguiente script compara cadenas:

Ejemplo

#!/bin/sh

site="ejemplo"

case "$site" in
   "ejemplo") echo "Tutorial para novatos"
   ;;
   "google") echo "Búsqueda de Google"
   ;;
   "taobao") echo "Taobao"
   ;;
esac

El resultado de salida es:

Tutorial para principiantes

Salir del bucle

Durante la ejecución de un bucle, a veces es necesario forzar la salida del bucle antes de alcanzar la condición de finalización. Shell usa dos comandos para implementar esta función:breakycontinue。

El comando break

El comando break permite salir de todos los bucles (termina la ejecución de todos los bucles posteriores).

En el siguiente ejemplo, el script entra en un bucle infinito hasta que el usuario ingresa un número mayor que 5. Para salir de este bucle y volver al prompt de shell, se necesita usar el comando break.

Ejemplo

#!/bin/bash
while :
do
    echo -n "Ingresa un número entre 1 y 5:"
    read aNum
    case $aNum in
        1|2|3|4|5) echo "El número que ingresaste es$aNum!"
        ;;
        *) echo "¡El número que ingresaste no está entre 1 y 5! Juego terminado"
            break
        ;;
    esac
done

Al ejecutar el código anterior, el resultado de salida es:

输入 1 到 5 之间的数字:3
你输入的数字为 3!
输入 1 到 5 之间的数字:7
你输入的数字不是 1 到 5 之间的! 游戏结束

continue

El comando continue es similar al comando break, con una sola diferencia: no sale de todos los bucles, sino solo del bucle actual.

Modifiquemos el ejemplo anterior:

Ejemplo

#!/bin/bash
while :
do
    echo -n "Ingresa un número entre 1 y 5: "
    read aNum
    case $aNum in
        1|2|3|4|5) echo "El número que ingresaste es$aNum!"
        ;;
        *) echo "¡El número que ingresaste no está entre 1 y 5!"
            continue
            echo "Juego terminado"
        ;;
    esac
done

Al ejecutar el código se observa que, cuando se ingresa un número mayor que 5, el bucle en este ejemplo no termina; la sentenciaecho "Juego terminado"nunca se ejecutará.

Otras extensiones