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.
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:
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)?
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
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
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!