Shell três tipos de loops (por; enquanto - RANDOM adivinhando o jogo de preços; até) e dois tipos de interrupções (pausa continuar) - fáceis de entender e muitos exemplos

One, for loop

(A) para loop

O loop for, também chamado de loop condicional, ou for i in, é na verdade a característica do loop for. O número de vezes e as condições fornecidas são proporcionais à
estrutura da instrução for.
Valores de variáveis ​​diferentes são lidos e usados ​​para executar o mesmo conjunto de comandos um por um.

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

Insira a descrição da imagem aqui
Atravessar

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

Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

Exemplo 1 (criar usuários em lotes)

1. Crie um arquivo contendo o nome de usuárioInsira a descrição da imagem aqui
2. Escreva o roteiro

#/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. Verificação
Insira a descrição da imagem aqui

Exemplo 2 (testando a conectividade do 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

Insira a descrição da imagem aqui

Existem várias questões, por exemplo, introduzidas no artigo anteriorlink

Dois, loop while

(1) Primeiro, olhe para o conteúdo dos exemplos de perguntas

Adivinhe o jogo de preços

方法一:不使用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"

(Dois) loop while

Contanto que a condição seja estabelecida, o loop será repetido e parará imediatamente se falhar.
1, estrutura da instrução while

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

Insira a descrição da imagem aqui

#/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

O primeiro script exibe o conteúdo de 0-10, o segundo script exibe o conteúdo de 1-11
(Observe a localização da iteração)

(3) Exemplo 2

Adicione 5 usuários começando com stu em lote; stu1 — stu5, senha inicial 1234

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

Três, até (loop anti-while)

(1) até

Teste repetidamente uma determinada condição, desde que a condição não seja estabelecida, repita o loop
1, até a estrutura da instrução

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

Insira a descrição da imagem aqui

Exibir um número inteiro de 1 a 10

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

(2) Exemplo 1

Calcule a soma de inteiros de 1 a 50

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

Quatro, dois tipos de interrupção (interromper e continuar)

break salta de um único loop; continue aborta um comando em um loop, mas não aborta completamente o comando inteiro

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
 

Insira a descrição da imagem aqui
Prosseguir

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

Insira a descrição da imagem aqui

Cinco, conversão comum em personagens

cho -n significa saída sem
quebras de linha . echo -e produz caracteres de escape e exibe o conteúdo de escape na tela.
Os caracteres de escape comumente usados ​​são os seguintes:

  • Depois que \ b é escapado, é equivalente a pressionar a tecla backspace (backspace), mas a premissa é que existem caracteres após "\ b"; "\ b" significa deletar o caractere anterior, e "\ b \ b" significa deletar os primeiros dois caracteres
  • \ c não quebra a saída. Quando não há caracteres depois de "\ c", é equivalente a echo -n; mas quando ainda há caracteres depois de "\ c", os caracteres depois de "\ c" não serão exibidos
  • \ n Nova linha, os caracteres a serem produzidos começam em uma nova linha de "\ n"
  • \ f Nova linha, mas o início da nova linha após a nova linha é conectado ao final da linha anterior
  • \ v é o mesmo que \ f
  • \ t Após a virada, significa inserir uma guia, ou seja, uma guia horizontal
  • \ r O cursor se move para o início da linha, mas não quebra, o que é equivalente a usar os caracteres após "\ r" para substituir os caracteres do mesmo comprimento antes de "\ r"; mas quando não há nenhum caractere depois "\ r", "\ r" O caractere anterior não será sobrescrito
  • \ Significa inserir "" a si mesmo;

Seis, separador de campo IFS

Contém espaços, tabulações e novas linhas por padrãoconjunto | grep IFS

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

(1) Exemplos de perguntas

Saída de todos os diretórios contidos na variável de ambiente PATH e todos os arquivos executáveis ​​neles

para

#/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默认值

Acho que você gosta

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