Shell Script – Switch/case e select

Quem já fez alguma matéria de programação na faculdade ou algum curso técnico ou até mesmo algum curso ou vídeo-aulas esta se identificando bastante com os tópicos de shell script e é a mesma ideia, porém para quem não conhece irei explicar.

A estrutura Switch/case é como se fosse uma estrutura if porém não aceita operações logicas como utilizamos, e ela já possui todas as opções(cases) definidos.

Estrutura de um Switch/Case:
case OPCAO in
1) echo "Um" ;; #Se foi informado a opção 1 então realiza o echo, no caso o parâmetro é numero
dois) echo "2" ;; # Podendo ser texto
*) echo "Opcao Invalida!" ;; # Algo que não se enquadre acima
esac

Vamos a um exemplo acho que irá ajudar esclarecer, switchcaseEx1.sh:

#!/bin/bash

case $1 in
1) echo "Um" ;;
2) echo "dois" ;;
3) echo "tres" ;;
4) echo "quatro" ;;
5) echo "cinco" ;;
6) echo "seis" ;;
7) echo "sete" ;;
8) echo "oito" ;;
9) echo "nove" ;;
10) echo "dez" ;;
*) echo "Opcao Invalida!" ;;
esac

Saída:

cleiton@linuxVM:~/projetos/shell script$
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh
Opcao Invalida!
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh 5
cinco
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh 9
nove
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh 0
Opcao Invalida!
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh 1
Um
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx1.sh 3
tres
cleiton@linuxVM:~/projetos/shell script$

Agora vamos com um exemplo usando texto como opção, switchcaseEx2.sh:

#!/bin/bash

case $1 in
um) echo "1" ;;
dois) echo "2" ;;
tres) echo "3" ;;
quatro) echo "4" ;;
cinco) echo "5" ;;
seis) echo "6" ;;
sete) echo "7" ;;
oito) echo "8" ;;
nove) echo "9" ;;
dez) echo "10" ;;
*) echo "Opcao Invalida!" ;;
esac

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh um
1
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh tres
3
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh dez
10
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh nove
9
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh Nove
Opcao Invalida!
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh Dois
Opcao Invalida!
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx2.sh dois
2

Agora a sacada, usando texto, numero e/ou ambas combinações no switchcaseEx3.sh:

#!/bin/bash

case $1 in
1) echo "um" ;;
dois) echo "2" ;;
tres) echo "3" ;;
quatro) echo "4" ;;
5) echo "cinco" ;;
6|SEIS|Seis|seis) echo "6" ;;
sete) echo "7" ;;
oito) echo "8" ;;
nove) echo "9" ;;
dez) echo "10" ;;
*) echo "Opcao Invalida!" ;;
esac

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh cinco
Opcao Invalida!
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh 5
cinco
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh quatro
4
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh seis
6
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh Seis
6
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh SEIS
6
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh seis
6
cleiton@linuxVM:~/projetos/shell script$ ./switchcaseEx3.sh 6
6

Com o case 6 foi possível 4 tipos de entradas, muito útil este tipo de uso.

Estrutura de um Select:

Esse é legal, imagine um menu pronto para o operador, eis o comando. Segue a estrutura abaixo:

#!/bin/bash
#select NOME_VAR in lista_de_opcoes
select VAR_CONTROLE in opcao1 opca2 opcao3 ... nada
do
echo "Opcao escolhida $VAR_CONTROLE"
break;
done

Agora vamos ao exemplo selectEx1.sh:

#!/bin/bash
select SUCO in laranja abacaxi caju uva limao
do
echo "Voce escolheu o suco de $SUCO"
done

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./selectEx1.sh
1) laranja
2) abacaxi
3) caju
4) uva
5) limao
#? 3
Voce escolheu o suco de caju
#?

Como podemos ver no exemplo acima, apenas colocamos uma lista de opções e ele gera o “menu”, mas tem um inconveniente, eu escolho uma opção ele mostra ela porém aguarde informar outra opção, as vezes isso não é desejado, resolvendo isso facilmente no selectEx2.sh:

#!/bin/bash
select SUCO in laranja abacaxi caju uva limao
do
echo "Voce escolheu o suco de $SUCO"
break;
done

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./selectEx2.sh
1) laranja
2) abacaxi
3) caju
4) uva
5) limao
#? 4
Voce escolheu o suco de uva
cleiton@linuxVM:~/projetos/shell script$

Hum, legal heim. Porém nosso script inicia, mas nenhuma mensagem é exibida sobre as opções como “Escolha um suco” para isso teria que usar um echo antes, mas não vamos usar porque conseguimos isso com o select também, vamos ao exemplo selectEx3.sh:

#!/bin/bash

PS3="Selecione o suco desejado: "
select SUCO in laranja abacaxi caju uva limao
do
echo "Voce escolheu o suco de $SUCO"
break;
done

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./selectEx3.sh
1) laranja
2) abacaxi
3) caju
4) uva
5) limao
Selecione o suco desejado: 2
Voce escolheu o suco de abacaxi
cleiton@linuxVM:~/projetos/shell script$

Enquanto PS1 e PS2 são para interações com o prompt o PS3 é para o select, essa foi a grande sacada deste exemplo.
E dentro do select você pode usar vários outros comandos e estruturas que vimos aqui como if e else e o próprio switch/case, vamos ao exemplo selectEx4.sh:

#!/bin/bash

PS3="Informe a linguagem que deseja estudar: "
select LINGUAGEM in c c++ php javascript python perl shell c# vb java nenhuma
do
echo "Escolheu $LINGUAGEM "

case $LINGUAGEM in php | javascript)
echo "Voce ira programar para web";;
c | c++)
echo "Voce ira programar embarcado ou device driver";;
python | perl | shell | c# | vb | java)
echo "Voce ira programar para servidor, desktop, web ou mobile.";;
nenhuma)
echo "Quem sabe futuramente $LINGUAGEM nao sera suportada"
break;;
*)echo "ERRO: Linguagem nao suportada nesta etapa";;
esac
break;
done

Saída:

cleiton@linuxVM:~/projetos/shell script$ ./selectEx4.sh
1) c 4) javascript 7) shell 10) java
2) c++ 5) python 8) c# 11) nenhuma
3) php 6) perl 9) vb
Informe a linguagem que deseja estudar: 5
Escolheu python
Voce ira programar para servidor, desktop, web ou mobile.

cleiton@linuxVM:~/projetos/shell script$ ./selectEx4.sh
1) c 4) javascript 7) shell 10) java
2) c++ 5) python 8) c# 11) nenhuma
3) php 6) perl 9) vb
Informe a linguagem que deseja estudar: 10
Escolheu java
Voce ira programar para servidor, desktop, web ou mobile.

cleiton@linuxVM:~/projetos/shell script$ ./selectEx4.sh
1) c 4) javascript 7) shell 10) java
2) c++ 5) python 8) c# 11) nenhuma
3) php 6) perl 9) vb
Informe a linguagem que deseja estudar: 11
Escolheu nenhuma
Quem sabe futuramente nenhuma nao sera suportada

cleiton@linuxVM:~/projetos/shell script$ ./selectEx4.sh
1) c 4) javascript 7) shell 10) java
2) c++ 5) python 8) c# 11) nenhuma
3) php 6) perl 9) vb
Informe a linguagem que deseja estudar: 1
Escolheu c
Voce ira programar embarcado ou device driver
cleiton@linuxVM:~/projetos/shell script$

Acho que deu para compreender a ideia do switch/case e o select, o tipo de saída e resultado que cada um possui e os recursos que podemos combinar, entendendo este post você pode fazer diversos scripts com if, else, switch/case, for, while, uso de break e sem break e seu efeito, crie scripts para ir treinamento e testando os recursos até aqui passado.

Até a próxima!

Share Button

CC BY-NC-SA 4.0 Shell Script – Switch/case e select by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.