[Notas de estudo do Linux 31] fluxo de execução do shell (para, enquanto, até, se, caso, esperar, interromper, continuar, sair)

1. for loop


格式:
for 变量 in item1 item2 … itemN
do
  语句1
  语句2
done


写成一行:
for 变量 in item;do 语句1;语句2 done;


A instrução for define quatro formas de variáveis

for var in $(seq 起点 终点 步长)
for var in 1 2 3 ... 10
for var in{
    
    1..10}
for((var=0;var<10;var++))
#无限循环
for (( ; ; ))

Exercício 1:

Script: check_host.sh
detecta se 10 hosts e seu host atual estão diretamente conectados ao host que está desbloqueado, se desbloqueado, a lista de ip do host será exibida.


#!/bin/bash
for i in {
    
    1..10}
do
	ping -c1 -w1 172.25.254.$i &> /dev/null && {
    
    
		echo " 172.25.254.$i tongchang !"
	} 
done

Insira a descrição da imagem aqui

Exercício 2:

Script create.sh

  1. Criar usuários automaticamente
  2. Adicionar arquivo de nome de usuário e arquivo de senha após o script
  3. Detectar automaticamente se o usuário existe no arquivo do usuário e criá-lo automaticamente se ele não existir, e a senha é o conteúdo do arquivo de senha correspondente

#!/bin/bash
length=`sed -n '$=' user_file`
for LINE in `seq 1 $length`
do
	uName=`sed -n ${
     
     LINE}p $1`
	uPass=`sed -n ${
     
     LINE}p $2`
	id $uName &> /dev/null && {
    
     
		echo "$uName is exist !"
	} || {
    
    
			useradd $uName
			echo $uPass | passwd --stdin $uName &> /dev/null 
			echo "$uName is created !"
		}
done

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui



2. Loop while (condição é verdadeira)


while 条件
do
  语句1
  语句2
done


Formato de loop infinito 1:

while true
do
  语句
done


Formato de loop infinito 2:

while :
do
  语句
done


3. loop até (condição é falsa)


O loop until executa uma série de comandos até que a condição seja verdadeira e pare.
O loop until e o loop while são tratados da maneira oposta.
Geralmente o loop while é melhor do que o loop until, mas em alguns casos - e apenas em casos raros, o loop until é mais útil


until 条件
do
  语句1
  语句2
done


4. se


if 条件
then
  语句
elif 条件
then
  语句
else
  语句
fi


(Se o outro ramo não tiver nenhuma instrução para executar, não escreva este outro)

Exercício 1:

check_file.sh
detecta se o arquivo existe e determina o tipo de arquivo


#!/bin/bash
while true
do
	read -p "Please input filename:" fileName
	
	if [ "$fileName" == "exit" ]
	then
		exit
	fi

	if [ -e "$fileName" ]
	then
		if [ -f "$fileName" ]
		then
			echo "$fileName is 普通文件 ! "
		elif [ -d "$fileName" ]
		then
			echo "$fileName is 目录 ! "
		elif [ -S "$fileName" ]
		then
			echo "$fileName is 套接字 ! "
		elif [ -L "$fileName" ]
		then
			echo "$fileName is 软链接 ! "
		elif [ -b "$fileName" ]
		then
			echo "$fileName is 块设备 ! "
		elif [ -c "$fileName" ]
		then
			echo "$fileName is 字符设备 ! "
		fi
	else
		echo "$fileName is not exist !"
	fi

done

Insira a descrição da imagem aqui



5. caso


A declaração case é uma declaração de múltipla escolha. Você pode usar a instrução case para combinar um valor e um padrão. Se a correspondência for bem-sucedida, execute o comando correspondente


casein
模式1)
  语句
  ;;
模式2)
  语句
  ;;
*)
  语句
  ;;
esac


(" *) " indica outras circunstâncias)


Exercício:

Adicione disco ou memória ou faça upload após system_watch.sh, execute da seguinte forma:

  1. monitor de disco uso de disco
  2. monitor de memória uso de memória
  3. carregar monitor iniciar carregamento
  4. Exibir por segundo

#!/bin/bash
while true
do
	[ "$1" = "exit" ] && {
    
    
		exit
		}
	case $1 in
	disk|DISK)
		watch -n 1 "df -h "
		exit
		;;
	memory|MEMORY)
		watch -n 1 "free -m"
		exit
		;;
	upload|UPLOAD)
		watch -n 1 "uptime"
		exit
		;;
	esac
done


6. Espere uma conversa automática


dnf install expect -y: Instalação esperada

Script de pergunta: ask.sh (dar permissão de execução)

#!/bin/bash
read -p "What's your name: " NAME
read -p "How old are you: " AGE
read -p "which class? " CLASS
read -p "How do you feel? " FEEL
echo $NAME is $AGE\'s old study $CLASS fell $FEEL

Script de resposta 1: answer.exp

#!/usr/bin/expect
spawn /mnt/ask.sh
expect "name"
send "tom\r"
expect "old"
send "18\r"
expect "class"
send "linux\r"
expect "feel"
send "happy\r"
expect eof


Script de resposta 2: answer.exp

#!/usr/bin/expect
set timeout 2
spawn /mnt/ask.sh

expect {
    
    
"name" {
    
     send "tom\r"; exp_continue }
"old" {
    
     send "18\r"; exp_continue }
"class" {
    
     send "linux\r" ; exp_continue }
"feel" {
    
     send "happy\r" }
}
expect eof


Script de resposta 3: answer.exp

#!/usr/bin/expect
set NAME [ lindex $argv 0 ]
set AGE [ lindex $argv 1 ]
set CLASS [ lindex $argv 2 ]
set FEEL [ lindex $argv 3 ]

set timeout 2
spawn /mnt/ask.sh

expect {
    
    
"name" {
    
     send "$NAME\r" ; exp_continue }
"old" {
    
     send "$AGE\r" ; exp_continue }
"class" {
    
     send "$CLASS\r" ; exp_continue }
"feel" {
    
     send "$FEEL\r" }
}
expect eof


Script de resposta 4: answer.sh

#!/bin/bash
echo hello zy !
/usr/bin/expect <<EOF
set timeout 2
spawn /mnt/ask.sh

expect {
"name" { send "$1\r" ; exp_continue }
"old" { send "$2\r" ; exp_continue }
"class" { send "$3\r" ; exp_continue }
"feel" { send "$4\r" }
}
expect eof
EOF


Exercício:

host_list.sh
detecta se a rede 172.25.254.1-172.25.254.10 está normalmente ligada, se a rede estiver normal, gere uma lista de resolução host_list


#!/bin/bash
EXPECT()
{
    
    
/usr/bin/expect <<EOF
set timeout 2
spawn ssh root@$1 hostname
expect {
"yes/no?" { send "yes\r" ;
    expect "password:" ;
    send "$2\r";
    exp_continue; }
"password:" { send "$2\r" }
}
expect eof
EOF
}

for i in {
    
    1..10}
do
    ping -c1 -w1 172.25.254.$i &> /dev/null
    if [ "$?" = "0" ]
    then
        host_name=`EXPECT 172.25.254.$i westos | tail -n 1`
        grep $host_name /mnt/host_list &> /dev/null || {
    
    
            echo "172.25.254.$i $host_name" >> /mnt/host_list
        }
    fi  
done
sed 's/^M//g' -i /mnt/host_list
#^M为<ctrl>+<V>+<M>

Insira a descrição da imagem aqui



7. Saia do circuito (interrompa e continue e saia)


pausa: Permite pular de todos os loops (encerrar todos os loops após a execução)

continuar: Ele não vai pular de todos os loops, apenas do loop atual

Saída:cair fora

Acho que você gosta

Origin blog.csdn.net/weixin_46069582/article/details/111416105
Recomendado
Clasificación