Shell tres tipos de bucles (para; mientras — adivinar el precio ALEATORIO; hasta) y dos tipos de interrupciones (romper continuar) —fácil de entender y muchos ejemplos

Uno, para bucle

(A) para bucle

El bucle for, también llamado bucle condicional, o for i in, es en realidad la característica del bucle for. El número de veces y las condiciones dadas son proporcionales a la
estructura de la instrucción for.
Se leen y utilizan diferentes valores de variable para ejecutar el mismo conjunto de comandos uno a uno.

for 变量名 in 取值列表
do                   
   命令序列
done

Inserte la descripción de la imagen aquí
atravesar

for i in {
    
    1..10}      迭代加1       |  {
    
    1..10..2}          迭代,每次循环加2
    或  $(seq 1 10)                |  $(seq 1 2 10)
或for ((i=1; i<=10; i++))          |  ((i=1; i<=10; i+=2))
do
echo $i
done 
#/bin/bash
#1-10
for ((i=1; i<=10; i++))$(seq 1 10)或者for i in {
    
    1..10}
do
 echo $i
done

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ejemplo 1 (crear usuarios en lotes)

1. Cree un archivo que contenga el nombre de usuario.Inserte la descripción de la imagen aquí
2. Escribe el guión

#/bin/bash
#passwd
a=$(cat name.txt)
for i in a
do
 useradd $i
 echo "1234" | passwd --stdin $i
或echo -e "1234\n1234\n" | passwd $i  // 或这使用\n代表回车键
done
                                      

3. Verificación
Inserte la descripción de la imagen aquí

Ejemplo 2 (prueba de la conectividad del host)

#!/bin/bash
#ping范围主机
for i in 172.16.100.{
    
    1..20}
do
 ping -c 3 -i 0.5 -W 2 $i &> /dev/null
if [ $? = 0 ]
  then
    echo "$i online"
else
 echo "$i offline"
fi
done

Inserte la descripción de la imagen aquí

Hay varias preguntas, por ejemplo, presentadas en el artículo anterior.Enlace

Dos, mientras que bucle

(1) Primero observe el contenido de las preguntas de muestra

Adivina el juego de precios

方法一:不使用break循环
price=$[$RANDOM % 1000]
a=0
times=0
echo "猜猜商品价格是多少"
while [ $a -eq 0 ]
do
let times++
read -p "请输入你猜的价格:" b
if [ $b -eq $price ];then
  echo "yes!"
  let a++
elif [ $b -gt $price ];then
  echo "你猜大了!"
elif [ $b -lt $price ];then
  echo "你猜小了!"
fi
done
echo "你总共猜了 $times 次"

方法二:
#!/bin/bash
#猜价格
let a=$RANDOM%1000
b=0
d=0
while yes!
do
read -p "输入价格" c
if [ $c = $a ]
  then
    echo "yes"
     break
elif [ $c -lt $a ]
  then
    echo "太低了"
else
    echo "太高了"
fi
let d++
done
echo "你输入多少次 $d"

(Dos) bucle while

Siempre que se establezca la condición, el ciclo se repetirá y se detendrá inmediatamente si falla.
1, estructura de instrucción while

while 条件测试操作
do
   命令序列
done

Inserte la descripción de la imagen aquí

#/bin/bash                             #/bin/bash                                  
#example                               #example
i=0                         注          i=0 
while (( $i <= 10 ))while [ $i -eq 10 ]
dodo 
echo "$i"let i++
let i++                                echo "$i"
done                                   done

El primer script genera el contenido de 0-10, el segundo script genera el contenido de 1-11
(Tenga en cuenta la ubicación de la iteración)

(3) Ejemplo 2

Agregue 5 usuarios comenzando con stu en lote; stu1 — stu5, contraseña inicial 1234

#/bin/bash
#useradd
i=0
while [ $i -le 4 ]
do
let i++
useradd stu$i
echo "1234" | passwd --stdin stu$i
done

Tres, hasta (bucle anti-while)

(1) hasta

Pruebe repetidamente una determinada condición, siempre que la condición no esté establecida, repita el ciclo
1, hasta que la estructura de la declaración

until 条件测试操作
do  
   命令序列
done

Inserte la descripción de la imagen aquí

Mostrar un número entero del 1 al 10

i=1
until [ $i -gt 10 ]       //i的值大于等10 不满足i>10的情况下执行循环
do
echo "$i"
let i++
done

(2) Ejemplo 1

Calcular la suma de números enteros del 1 al 50

#/bin/bash
#sum 1-50
i=1
sum=0
until [ $i -gt 50 ]
do
sum=$(($sum+$i))
let i++
done
echo "$sum"

Cuatro, dos tipos de interrupción (romper y continuar)

break salta de un solo bucle; continue aborta un comando en un bucle, pero no cancela completamente el comando completo

for i in {
    
    1..5}
do
echo "外层循环 $i"
   for b in {
    
    1..5}
   do
     if [ $b -eq 3 ]
     then
      break            //break2则也停止外层循环
     fi
     echo "内层循环 $b"
     done
done
 

Inserte la descripción de la imagen aquí
Seguir

for i in {
    
    1..5}
do
echo "外层循环 $i"
   for b in {
    
    1..5}
   do
     if [ $b -eq 3 ]
     then
      continue
     fi
     echo "内层循环 $b"
     done
done

Inserte la descripción de la imagen aquí

Cinco, conversión común a personajes

cho -n significa salida sin
saltos de línea . echo -e muestra caracteres de escape y muestra el contenido de escape en la pantalla.
Los caracteres de escape comúnmente utilizados son los siguientes:

  • Después de escapar de \ b, es equivalente a presionar la tecla de retroceso (retroceso), pero la premisa es que hay caracteres después de "\ b"; "\ b" significa eliminar el carácter anterior y "\ b \ b" significa eliminar los dos primeros caracteres
  • \ c no ajusta la salida. Cuando no hay caracteres después de "\ c", es equivalente a echo -n; pero cuando todavía hay caracteres después de "\ c", los caracteres después de "\ c" no se mostrarán.
  • \ n Nueva línea, los caracteres que se generarán comienzan en una nueva línea desde "\ n"
  • \ f Newline, pero el comienzo de la nueva línea después de la nueva línea está conectado al final de la línea anterior
  • \ v es lo mismo que \ f
  • \ t Después del giro, significa insertar una pestaña, es decir, una pestaña horizontal
  • \ r El cursor se mueve al principio de la línea, pero no se ajusta, lo que equivale a usar los caracteres después de "\ r" para sobrescribir los caracteres de la misma longitud antes de "\ r"; pero cuando no hay ningún carácter después "\ r", "\ r" El carácter anterior no se sobrescribirá
  • \ Significa insertar "" en sí mismo;

Seis, separador de campo IFS

Contiene espacios, pestañas y nuevas líneas de forma predeterminadaconjunto | grep IFS

1.修改
IFS=$'\t\n'
修改成只换行
IFS=$'\n'
IFS=':'
IFS=','
2.备份
IFS. OLD=$IFS
IFS=$'\n'
...
IFS=$IFS.OLD

(1) Ejemplos de preguntas

Salida de todos los directorios contenidos en la variable de entorno PATH y todos los archivos ejecutables en ellos

por

#/bin/bash
OLDIFS=$IFS      ///备份IFS参数
IFS=':'          ///以:分割的字段输出,这样i就可以按字段取值
 for i in $PATH
 do
   for a in $i/*
   do
    if [ -x $a -a -f $a ];then
      echo "$a 文件有执行权限"
    fi
   done
 done
IFS=$OLDIFS       ///还原IFS默认值

Supongo que te gusta

Origin blog.csdn.net/weixin_53567573/article/details/114481486
Recomendado
Clasificación