Instruções CASE

Introdução ao Bash Scripting

Alex Scriven

Data Scientist

Por que usar CASE

Instruções CASE podem ser mais eficientes que IF quando há várias condições ou condições complexas.

Suponha que você queira testar as condições e ações a seguir:

  • Se um arquivo contiver sydney, mova-o para o diretório /sydney
  • Se um arquivo contiver melbourne ou brisbane, exclua-o
  • Se um arquivo contiver canberra, renomeie para IMPORTANT_filename, onde filename era o nome original
Introdução ao Bash Scripting

Um IF complexo

Você poderia construir várias instruções IF assim:

  • Este código chama grep no primeiro argumento de ARGV para a condicional.
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • Parece complexo e repetitivo, né?
Introdução ao Bash Scripting

Monte uma instrução CASE

  • Comece escolhendo qual variável ou string será comparada
    • Você pode chamar um shell dentro de outro aqui!
  • Adicione quantos padrões e ações quiser.
    • Você pode usar regex no PATTERN, como Air* para "começa com Air" ou *hat* para "contém hat".
  • Separe o padrão do código com fecha-parêntese e finalize comandos com ponto e vírgula duplo

Formato básico de CASE:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Introdução ao Bash Scripting

Monte uma instrução CASE

 

  • *) DEFAULT COMMAND;;

    • É comum (mas não obrigatório) finalizar com um comando padrão que roda se nenhum outro padrão corresponder.
  • esac Por fim, a palavra de fechamento é "esac"

    • É "case" ao contrário!

Formato básico de CASE:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Introdução ao Bash Scripting

De IF para CASE

Nosso IF antigo:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

Nosso novo CASE:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Introdução ao Bash Scripting

Vamos praticar!

Introdução ao Bash Scripting

Preparing Video For Download...