Shell Unix / Linux - O caso ... Declaração esac

Você pode usar vários if...elifinstruções para realizar uma ramificação multiway. No entanto, nem sempre essa é a melhor solução, especialmente quando todos os ramos dependem do valor de uma única variável.

Suporta Shell case...esac que lida exatamente com esta situação, e o faz de maneira mais eficiente do que instruções if ... elif repetidas.

Sintaxe

A sintaxe básica do case...esac declaração é fornecer uma expressão para avaliar e executar várias declarações diferentes com base no valor da expressão.

O intérprete verifica cada caso em relação ao valor da expressão até que uma correspondência seja encontrada. Se nada corresponder, uma condição padrão será usada.

case word in
   pattern1)
      Statement(s) to be executed if pattern1 matches
      ;;
   pattern2)
      Statement(s) to be executed if pattern2 matches
      ;;
   pattern3)
      Statement(s) to be executed if pattern3 matches
      ;;
   *)
     Default condition to be executed
     ;;
esac

Aqui, a palavra da string é comparada com todos os padrões até que uma correspondência seja encontrada. A (s) instrução (ões) seguindo o padrão correspondente é executada. Se nenhuma correspondência for encontrada, a instrução case sai sem realizar nenhuma ação.

Não há um número máximo de padrões, mas o mínimo é um.

Quando a (s) parte (s) instrução (ões) é executada, o comando ;; indica que o fluxo do programa deve pular para o final de toda a instrução case. Isso é semelhante a quebrar na linguagem de programação C.

Exemplo

#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
   "apple") echo "Apple pie is quite tasty." 
   ;;
   "banana") echo "I like banana nut bread." 
   ;;
   "kiwi") echo "New Zealand is famous for kiwi." 
   ;;
esac

Após a execução, você receberá o seguinte resultado -

New Zealand is famous for kiwi.

Um bom uso para uma instrução case é a avaliação dos argumentos da linha de comando da seguinte maneira -

#!/bin/sh

option="${1}" 
case ${option} in 
   -f) FILE="${2}" 
      echo "File name is $FILE"
      ;; 
   -d) DIR="${2}" 
      echo "Dir name is $DIR"
      ;; 
   *)  
      echo "`basename ${0}`:usage: [-f file] | [-d directory]" 
      exit 1 # Command to come out of the program with status 1
      ;; 
esac

Aqui está um exemplo de execução do programa acima -

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.htm
$ vi test.sh
$ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix
Dir name is unix
$
unix-decision-making.htm