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
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
...
fisi 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
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
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
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
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
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 -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
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 '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
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
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
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