Como usar o case … Declarações Esac em bash

Conteúdo

Bash Shell

Neste tutorial, analisamos as declarações condicionais suportadas em casos Bash. Revisamos exemplos práticos e discutimos quando um caso Bash … a declaração esac é melhor usada do que uma mais tradicional. if .. then .. fi demonstração.

Caso Bash .. Declarações Esac em bash

Disponível nativamente a partir do shell bash, sentenças condicionais de casos, formulado usando o case e esac expressões idiomáticas (um idioma é uma palavra ou grupo de palavras, o uma palavra-chave, com padrões de uso estabelecidos; uma forma de expressar uma linguagem de computador), pode-se construir uma condicional complexa caso a caso (daí o termo case) busca e declaração de execução por caso.

A parte de pesquisa de uma declaração baseada em caso é às vezes chamada Por favor selecione, o que leva ao termo selecione a declaração / caso (ou vice-versa), usado em algumas outras linguagens de codificação como VBA, para se referir ao mesmo tipo de paradigma de programação. Outro conjunto de linguagens (como C #, C ++, Java e JavaScript) eles chamam isso de mudança o trocar / caso demonstração. Todos estes têm significados e operações semelhantes.

Vamos construir nosso primeiro case .. esac declaração usando um script simples.

Um simples caso .. Esac texto

Definimos nosso script de teste test.sh Como segue:

#!/bin/bash

case "${1}" em 
  1) eco "Opção foi 1!";;
  2) eco "Opção foi 2!";;
  *) eco "Opção era outra coisa: '${1}'";;
Esac

A seguir, fazemos nosso script executável por execução chmod +x test.sh e, em seguida, executar o próprio script, cada vez que passa uma opção diferente como entrada.

Em nossa cláusula de abertura de caso, especificamos que queremos usar a primeira opção de entrada ($1) como uma variável para examinar. Nosso case .. esac declaração verificará cada opção (como indicado no texto anterior a um ) cláusula de fechamento idiomática) e depois processa o bloco de código (depois da ) idioma) para obter o resultado correto.

Observe que existem dois ; final de terminadores de instrução no final de cada linha. a razão para isso é simples; a sintaxe bash normal requer que você tenha pelo menos um idioma final ; (a menos que já esteja no final de uma linha), mas dentro do case .. esac demonstração, precisamos de um adicional ; para indicar que estamos terminando um bloco de código para um bloco de execução de código de caso específico.

Podemos ver como definimos o código para ambos os casos em que 1 e 2 se pasan al script, respectivamente. Apesar disto, O que acontece quando gastamos outra coisa? Nesse caso, nós queremos pular para o nosso de outros cláusula, indicado por um universal * idioma.

Um caso simples ... declaração esac em bash

Nós vemos como passamos 1 o 2 todo o script, a ação correta é tomada; Option was 1/2!. Também vemos como, se fizermos outra coisa, a * O bloco de código executa corretamente, e também mostra nossa primeira variável passada para o script. E se não passássemos nenhuma opção para o nosso script? a case .. esac o código ainda seria avaliado, e uma vez que nada corresponde, exceto para nosso pega-tudo * cláusula, que corre:

Não passar uma variável para o nosso script de teste também funciona por causa da cláusula * no nosso caso .. declaração esac

Então, E se nós assumíssemos, algo que pode parecer lógico, que podemos deixar um único ; declaração do fim da linha de cada case .. esac cláusula simplesmente porque um EOL é satisfeito ao mesmo tempo (fim da linha)?

Preenchimento incorreto do bloco de código em um caso bash.

Observe que apenas uma rescisão ; foi usado neste script. Bash não torna isso possível e um erro ocorre; a sintaxe final de rescisão de ;; é obrigatório, e algo para prestar atenção ao escrever case .. esac afirmações

Por que caso .. Esac E não e?

Nós também poderíamos escrever o código acima usando um if demonstração:

#!/bin/bash

if [ "${1}" == "1" ]; then
  echo "Opção foi 1!"
elif [ "${1}" == "2" ]; then
  echo "Opção foi 2!"
else
  echo "Opção era outra coisa: '${1}'";
ser

Uma alternativa para uma sentença de caso. esac usando um se. então.. Elif. mais.. Fi

Isso parece comparável em qualidade de código e brevidade em comparação com o nosso case .. esac código, e em determinadas situações e casos de uso específicos como estes, muitas vezes um if .. then .. elif .. else .. fi A resposta baseada funcionará bem.

Tendo dito isto, se e quando a complexidade da seleção se torna mais complexa ou maior, ou se houver seleções de caso multicamadas para executar (tenha em conta que case .. esac pode ser aninhado), pode valer a pena usar case .. esac declarações ao invés.

Outra boa característica do case .. esac afirmações é que se pode listar duas opções possíveis para um único bloco de execução de código, como veremos em nosso próximo exemplo, Apesar disto, isso também pode ser feito com o bash padrão if afirmações, usando como exemplo o -a (e e -o (você) opções de nossa cláusula de teste e especificando uma cláusula de teste secundária. Como um exemplo, if [ "${1}" -eq 1 -o "${1}" -eq 3 ]; then ... Observe que aqui também usamos comparações numéricas em vez de comparações baseadas em texto como em nosso exemplo anterior.

Para mais informações sobre if .. then .. else .. elif .. fi condicionais, Você também pode ler nossos testes pós-condicionais no Bash: E se, então, outro, elif.

Expandindo nosso caso

Vamos estender nosso script acima e tornar nossas condições um pouco mais complexas:

#!/bin/bash

case "${1}" em 
  1|3) eco "Opção foi 1!"
       eco "Ou, opção era 3!";;
  2|'uma') caso "${1}" em 
           2) eco "Opção foi 2!";;
         'uma') eco "A opção era 'a'!";;
         Esac;;
  *) eco "Opção era outra coisa: '${1}'";;
Esac

Um caso mais complexo ... declaração esac em bash com seletores adicionais

Nesta circunstância, Listamos duas opções possíveis para cada bloco de código e as separamos por um | separador. Observe como tudo funciona bem e as entradas 1 e 3 são analisados ​​corretamente. No segundo bloco de código, criamos um caso aninhado e usamos todas as entradas possíveis para o segundo bloco de código (a saber 2 e a) como novas opções no esac aninhado / ensino médio.

Novamente, isso funciona perfeitamente. O fluxo através do código é aquele no primeiro case demonstração, a 2|'a' o galho está tomado 2 o a Acontece, e depois o segundo case garante que qualquer um 2 o a é selecionado individualmente. Também é interessante o uso de ;; toda vez que queremos terminar um bloco de código para uma opção específica, e isso também se aplica ao término do aninhamento case .. esac, novamente com ;;, Em outras palavras esac;;.

Final

Neste tutorial, analisamos exemplos práticos de bash baseado case .. esac afirmações. Também vimos onde as declarações de caso são uma opção melhor do que as mais tradicionais.. if .. then .. fi declarações apoiadas.

Si Bash le interesa, pode encontrar o primer: Bash Loops: para, enquanto e para cima, Hacks de encerramento do processo Bash e como analisar corretamente os nomes dos arquivos no Bash.

Desfrutar!

Assine a nossa newsletter

Nós não enviaremos SPAM para você. Nós odiamos isso tanto quanto você.