Compartilhamento de tecnologia

[Linux][Shell][Controle lógico Shell] Explicação detalhada

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


1.se julgamento

1.se-então

  • gramática
    if command
    then
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
  • festaifAs instruções são diferentes de outras linguagens de programação, bash'sifDeclaração iráExecute diretamenteifOs seguintes comandos
    • Se o comandoExecutado corretamente (o código de status é 0), o comando então será executado
    • Caso contrário, não será executado, ou outras instruções lógicas serão executadas e, finalmente,fiFinalizar controle lógico

2.se-então-senão

  • gramática
    if command
    then
    	command
    else
    	command
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

3.elif

  • gramática
if command
then
	command
elif command
then
	command
fi
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.caso

  • Pode substituir muitosif-elsefilial
    case "变量" in
    值1)
     命令
     ;;
    值2)
     命令2
     ;;
    *)
     命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

5. Na verdade, suje as mãos

  • Monitoramento de memória
    #!/bin/bash
    
    FreeMem=`free -m | awk 'NR==2 {print $NF}'`
    CHARS="Current memory is $FreeMem"
    
    if [ "$FreeMem" -lt 16000 ]
    then
        echo $CHARS
        echo "内存不足,抓紧维护服务器!"
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • Leia o tamanho da comparação
    • Versão de filial única
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      fi
      
      if [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      fi
      
      if [ $a -gt $b ]
      then
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
    • versão multi-filial
      #!/bin/bash
      
      a=$1
      b=$2
      
      if [ $a -lt $b ]
      then
          echo "Yes, $a less than $b"
          exit 0
      elif [ $a -eq $b ]
      then
          echo "Yes, $a equal $b"
          exit 0
      else [ $a -gt $b ]
          echo "Yes, $a greater than $b"
          exit 0
      fi
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
  • Script de monitoramento MySQL
    #!/bin/bash
    
    if [ `netstat -tunlp | grep mysql | wc -l` -ge "1" ]
    then
        echo "MySQL is running"
    else
        echo "MySQL is stopped"
        # systemctl start mysql.service
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • Script de inicialização Rsync
    #!/bin/bash
    
    if [ "$#" -ne 1 ]
    then
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    if [ "$1" = "start" ]
    then
        /usr/bin/rsync --daemon
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -ge 1 ]
        then
            echo "Rsync is started"
            exit 0
        fi
    elif [ "$1" = "stop" ]
    then
        killall rsync &>/dev/null
        sleep 2
    
        if [ `netstat -tunlp | grep rsync | wc -l` -eq 0 ]
        then
            echo "Rsync is stopped"
            exit 0
        fi
    elif [ "$1" = "restart" ]
    then
        kill rsync
        sleep 1
    
        killpro=`netstat -tunlp | grep rsync | wc -l`
        /usr/bin/rsync --daemon
        sleep 1
    
        startpro=`netstat -tunlp | grep rsync | wc -l`
    
        if [ "$killpro" -eq 0 -a "$startpro" -ge 1 ]
        then
            echo "Rsync is restarted"
            exit 0
        fi
    else
        echo "Usage: $0 {start|stop|restart}"
        exit 1
    fi
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

2. Testes condicionais

0.Explicação antecipada

  • Sintaxe comumente usada para testes condicionais
    Adicione a descrição da imagem

  • Operadores de teste de string comumente usados
    Adicione a descrição da imagem

  • comparação numérica
    Adicione a descrição da imagem

  • Operadores lógicos
    Adicione a descrição da imagem

  • Tabela de comparação de cada comando
    Adicione a descrição da imagem


1. comando de teste

  • testA definição mais curta de um comando pode serAvaliar uma expressão
    • Se a condição for verdadeira, um valor 0 será retornado
    • Se a expressão não for verdadeira, é retornado um valor maior que 0 – que também pode ser chamado de valor falso
    • A maneira mais fácil de verificar o status do último comando executado é usar$?valor
  • parâmetro
    • Sobre um nome de arquivodetecção de tipo(existem ou não), tais como:test -e filename

      parâmetrosignificado
      -eO nome do arquivo existe?
      -fO nome do arquivo é um arquivo (file)
      -dSe o nome do arquivo é um diretório (directory)
      -bÉ o nome do arquivoblock devicedispositivo
      -cO nome do arquivo é umcharacter devicedispositivo
      -SO nome do arquivo é umSocketdocumento
      -pSe o nome do arquivo é um arquivo FIFO (pilha)
      -LSe o nome do arquivo é um arquivo de conexão
    • sobre arquivosDetecção de permissão,como:test -r filename

      parâmetrosignificado
      -rO nome do arquivo temlegívelpropriedades
      -wO nome do arquivo temgravávelpropriedades
      -xO nome do arquivo temExecutávelpropriedades
      -uO nome do arquivo temSUIDpropriedades
      -gO nome do arquivo temSGIDpropriedades
      -kO nome do arquivo tempedaço pegajosopropriedades
      -sÉ o nome do arquivoarquivo não vazio
    • sobreComparação entre dois arquivos,como:test file1 -nt file2

      parâmetrosignificado
      -nt(mais recente que), juizfile1É melhor do quefile2novo
      -ot(mais velho que), juizfile1É melhor do quefile2velho
      -efjuizfile1efile2Quer seja o mesmo arquivo, ele pode ser usado emlink físicosobre o julgamento de
      O principal significado é determinar se os dois arquivos apontam para o mesmoinode
    • sobreDeterminando entre dois inteiros,como:test num1 -eq num2

      parâmetrosignificado
      -eqDois números são iguais
      -neDois números não são iguais
      -gtnum1mais do que onum2
      -ltnum1menor quenum2
      -genum1maior ou igual anum2
      -lenum1menos que ou igual anum2
    • determinaçãodados de string

      parâmetrosignificado
      -zSe for uma string vazia, retornetrue
      -nSe não for uma string vazia, entãotrue
      =str1 == str2, então retornetrue
      !=str1 != str2, então retornetrue
    • Julgamento condicional múltiplo,como:test -r filename -a -x filename

      parâmetrosignificado
      -a(e) Ambas as situações são estabelecidas ao mesmo tempo
      -o(ou) qualquer uma das duas situações é verdadeira
      !negação lógica

2.[]

  • O teste condicional é frequentemente realizado em scripts, e os mais comumente usados ​​são colchetes.[]
  • teste[]o efeito é o mesmo
  • Elementos básicos
    • []Dois símbolos devem ser separados por espaços à esquerda e à direita
    • Deve haver um espaço entre o operador interno e a variável operacional, como:[ "a" = "b" ]
    • Durante a comparação de strings,> <Precisa ser escrito como> /<escapar
    • []corda média ou${}Use variáveis ​​tanto quanto possível""Colocado entre aspas duplas para evitar referências indefinidas a valores
      [ -n "$filename" ]
      
      • 1
    • []Pode ser usado em-a -oExecute operações lógicas, não suportadas&& ||
    • []é um comando interno do bash

3. Colchetes duplos

1.(())

2.[[]]

  • Colchetes duplos fornecemRecursos avançados para strings, correspondência de padrões e correspondência de expressões regulares
  • Elementos básicos
    • [[]]Dois símbolos devem ser separados por espaços à esquerda e à direita
    • Deve haver um espaço entre o operador interno e a variável operacional, como:[[ "a" = "b" ]]
    • Na comparação de strings, você pode usá-lo diretamente> <, não há necessidade de escapar
    • [[]]corda média ou${}Use variáveis ​​tanto quanto possível""entre aspas duplas
      • Se não for usado""Se estiver entre aspas duplas, a correspondência de padrões e metacaracteres será realizada.
    • [[]]Pode ser usado internamente&& ||Execute operações lógicas
    • [[]]É a palavra-chave do bash
    • [[]]Outros usos são iguais aos[]Mesmo

4. Na verdade, suje as mãos

  • Teste o julgamento lógico
    #!/bin/bash
    
    read -p "Pls input a char:> " var1
    
    [ "${var1}" -eq 1 ] && {
        echo ${var1}
        exit 0
    }
    
    [ "$var1" -eq 2 ] && {
        echo $var1
        exit 0
    }
    
    [ "$var1" -ne "1" -a "$var1" -ne "2" ] && {
        echo "Script Error"
        exit 1
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • Script de instalação simulado
    #!/bin/bash
    
    path=/scripts
    
    [ ! -d "$path" ] && mkdir -p scripts
    
    cat << END
    	1.[install lamp]
    	2.[install inmp]
    	3.[exit]
    END
    
    read -p "Pls input your choice:> " num
    
    # 判断输入是否合法
    [[ ! $num =~ [1-3] ]] && {
    	echo "The num you input must be in {1|2|3}"
    	echo "Input Error"
    	exit 1
    }
    
    [ $num -eq 1 ] && {
    	echo "start installing lamp...waiting..."
    	sleep 2
    
    	# 如果该脚本没权限
    	[ ! -x "$path/lamp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 2
    	}
    
    	# 安装脚本
    	source ${path}/lamp.sh
    	exit $?
    }
    
    [ $num -eq 2 ] && {
    	echo "start installing lnmp...waiting..."
    	sleep 2
    	[ ! -x "$path/lnmp.sh" ] || {
    		echo "The file does not exit or can't be exec"
    		exit 3
    	}
    	source ${path}/lnmp.sh
    	exit $?
    }
    
    [ $num -eq 3 ] && {
    	echo "Bye~"
    	exit 4
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

3. Laço

1.para

  • gramática
    for var in list
    do
    	commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • Suporte ao estilo de linguagem C
    for (( i=1;i<=10;i++ ))
    do
    	echo "The next number is $i"
    done
    
    • 1
    • 2
    • 3
    • 4

2.enquanto

  • gramática: aquitest commandeif-elseO formato da instrução é o mesmo e você pode usar qualquer comando bash

    • Perceberwhiledetest commandO código de status de saída deve mudar com o comando no loop. Caso contrário, se o código de status não mudar, o loop continuará continuamente.
      while test command
      do
      	commands
      done
      
      • 1
      • 2
      • 3
      • 4
  • whileOrdemVários comandos de teste podem ser escritos

    • apenasO código de status de saída do último comando de teste será usado para determinar se o loop deve ser encerrado.
    • Preste atenção às quebras de linha, vários comandos de teste devem aparecer individualmente em cada linha
      var1=10
      while echo $var1
      	[ $var1 -ge 0 ]
      do
      	echo "This is inside the loop"
      	var1=$[ $var1 -1 ]
      done
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7

3. até comando

  • untilewhilesimsignificado opostountilO comando requer que você especifique umComandos de teste que retornam códigos de saída diferentes de zero
    • Somente se o código de status de saída não for 0, o bash executará o comando de loop
  • gramática
    until test commands
    do
    	other commands
    done
    
    • 1
    • 2
    • 3
    • 4
  • untiltambémSuporta vários comandos de teste, apenas o último determina se o bash executa outros comandos
    until echo $var1
    	[ $var1 -eq 0 ]
    do
    	echo "Inside the loop:$var1"
    	var1=$[ $var1 - 25 ]
    done
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

4. Circuito de controle

1.pausa

  • efeito:Força a saída de qualquer tipo de loop
    • Ao saltar de vários loops,breakTerminará automaticamente o maior loop de memória em que estiver
  • Encerrar loop externonIndica o nível do loop do qual sair. O padrão é 1 e o próximo nível é 2.
    break n
    
    • 1

2.continuar

  • efeito: pule um determinado loop e vá diretamente para a parte de julgamento deste loop.

5. Processe a saída do loop

  • No shell script, o resultado após a saída do loop pode serRedirecionamento de saída
    for (( a = 1;a<10;a++ ))
    do
    	echo "The number is $a"
    done > test.txt
    echo "Finished"
    
    • 1
    • 2
    • 3
    • 4
    • 5