Como usar o caso .. Instruções esac no Bash

Neste tutorial, examinamos as declarações condicionais baseadas em casos Bash. Revisamos exemplos práticos e discutimos quando um caso Bash .. a instrução esac é melhor empregada em vez de uma instrução if .. then .. fi mais tradicional.
Caso Bash. Declarações esac no Bash
Disponível nativamente no shell Bash, declarações condicionais de maiúsculas e minúsculas, formuladas usando as expressões case e esac (um idioma é uma palavra ou um grupo de palavras, ou uma palavra-chave, com padrões de uso estabelecidos; uma forma de expressar uma linguagem de computador ), pode-se construir uma consulta condicional complexa caso a caso (daí o termo caso) e instrução de execução por caso.
A parte de pesquisa de uma instrução baseada em caso às vezes é chamada de select, levando ao termo instrução select / case (ou o inverso), usado em algumas outras linguagens de codificação como VBA, para se referir ao mesmo tipo de paradigma de programação. Ainda outro conjunto de linguagens (como C #, C ++, Java e JavaScript) chama isso de switch ou instrução switch / case. Todos eles têm significados e operações semelhantes.
Vamos construir nosso primeiro caso .. instrução esac usando um script simples.
Um caso simples .. script esac
Definimos nosso script de teste test. sh da seguinte maneira:
#! / bin / bash case "$" em 1) echo "Option was 1!" ;; 2) echo "A opção era 2!" ;; *) echo "A opção era outra coisa: '$'" ;; esac
Em seguida, tornamos nosso script executável executando chmod + x test. sh e, em seguida, executamos o próprio script, cada vez passando uma opção diferente como entrada.
No nosso caso, cláusula de abertura, especificamos que queremos usar a primeira opção de entrada ($ 1) como a variável a ser avaliada. Nosso caso .. a instrução esac verificará cada opção (conforme indicado pelo texto antes de a) idioma de fechamento de cláusula) e, em seguida, processará o bloco de código (após o idioma) para o resultado correto.
Observe que existem dois; terminadores de fim de instrução no final de cada linha. A razão para isso é simples; a sintaxe normal do Bash exige que você tenha pelo menos um idioma de terminação; (a menos que você já esteja no final de uma linha), mas dentro do case .. instrução esac, precisamos de um adicional; para indicar que estamos encerrando 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 os casos em que 1 e 2 são passados para o script, respectivamente. No entanto, o que acontece quando aprovamos outra coisa? Nesse caso, queremos pular para nossa outra cláusula, indicada por um * idioma universal.

Vemos como passamos 1 ou 2 para o script, a ação correta correspondente é realizada; A opção era 1/2 !. Também vemos como, se fizermos outra coisa, o * bloco de código será executado corretamente e também será exibida nossa primeira variável passada para o script. O que aconteceria se não passássemos nenhuma opção para o nosso script? O caso .. o código esac ainda seria avaliado e, como nada corresponde, exceto nossa cláusula catch-all *, aquele é executado:

Então, o que aconteceria se assumíssemos, algo que pode parecer lógico, que podemos deixar de fora um; declaração do final da linha de cada caso .. cláusula esac simplesmente porque ao mesmo tempo um EOL (final da linha) é alcançado?

Observe que apenas um único terminador; foi usado neste script. O Bash não permite isso e um erro é produzido; a sintaxe de terminação final de ;; é necessário e algo para se ter em mente ao escrever o caso .. declarações esac
Por que case .. esac e não se?
Também poderíamos escrever o código anterior usando uma instrução if:
#! / bin / bash if ["$" == "1"]; então echo "A opção era 1!" elif ["$" == "2"]; então echo "A opção era 2!" else echo "A opção era outra coisa: '$'"; fi

Isso parece comparável em qualidade e rapidez do código em comparação com o nosso caso .. código esac, e nas situações dadas e casos de uso específicos como estes, geralmente um if .. então. . elif .. else .. solução baseada em fi servirá bem.
Dito isso, se e quando a complexidade da seleção se tornar mais complexa ou maior, ou se houver seleções de casos em várias camadas a serem realizadas (observe que o caso .. esac pode ser aninhado), pode valer a pena usar case .. declarações esac em vez disso.
Outro recurso interessante das instruções case .. esac é que podemos listar duas opções possíveis para um único bloco de execução de código, como veremos em nosso próximo exemplo, no entanto, isso também pode ser feito com as instruções Bash if padrão, usando for exemplo as opções -a (e) e -o (ou) de nossa cláusula de teste e especificando uma cláusula de teste secundária. Por exemplo, if ["$" -eq 1 -o "$" -eq 3]; então ... Observe que aqui também usamos comparações numéricas em vez de comparações baseadas em texto, como em nosso exemplo acima.
Para obter mais informações sobre if .. then .. else .. elif .. fi condicionais, você também pode ler nosso artigo Teste condicional no Bash: if, then, else, elif .
Expandindo nosso caso
Vamos expandir nosso script anterior e tornar nossas condições um pouco mais complexas:
#! / bin / bash case "$" em 1 | 3) echo "A opção era 1!" echo "Ou, a opção era 3!" ;; 2 | 'a') case "$" em 2) echo "A opção era 2!" ;; 'a') echo "A opção era 'a'!" ;; esac ;; *) echo "A opção era outra coisa: '$'" ;; esac

Nesse caso, 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 analisadas corretamente. No segundo bloco de código, criamos um caso aninhado e usamos cada entrada possível para o segundo bloco de código (a saber 2 e a) como novas opções no esac aninhado / secundário.
Novamente, isso funciona perfeitamente. O fluxo através do código é que na primeira instrução de caso, o ramo 2 | 'a' é obtido é 2 ou a é passado e, então, o segundo caso garante que 2 ou a seja selecionado individualmente. De interesse também é o uso de ;; toda vez que desejamos encerrar um bloco de código para uma opção específica, e isso também se aplica ao encerramento do caso aninhado .. esac, novamente com ;;, ou seja, esac ;;.
Concluindo
Neste tutorial, vimos exemplos práticos de casos baseados em Bash. declarações esac. Também vimos onde as declarações case são uma escolha melhor do que as declarações baseadas em if .. then .. fi.
Se o Bash interessar a você, você pode considerar o Primer: Bash Loops: for, while e until, Bash Process Termination Hacks e como analisar corretamente os nomes dos arquivos no Bash como de seu interesse .
Divirta-se!
Nenhum comentário