Bash: if, case e test
Antes dos comandos:
;; indica fim do comando tal qual break.
;& também indica fim do comando, mas dizendo que o próximo comando deve ser executado independente do resultado do primeiro.
;&& como o de cima, porém indica que todos os comandos após este serão executados.
Flags:
-e caminho: avalia se o caminho existe.
-r caminho: avalia se o arquivo pode ser lido pelo usuário atual.
-f caminho: avalia se é um arquivo regular.
-d caminho: avalia se é um diretório.
-r caminho: avalia se é o arquivo/diretório é legível pelo usuário atual.
-w caminho: avalia se o arquivo/diretório pode ser escrito pelo usuário. atual.
-x caminho: avalia se o arquivo/diretório é executável.
-s caminho: avalia se o arquivo/diretório existe e tem tamanho maior que zero.
-L caminho: avalia se o arquivo/diretório é um link simbólico.
-b caminho: avalia se o arquivo é dispositivo de bloco.
-c caminho: avalia se é um arquivo de dispositivo de caractere.
-S caminho: avalia se é um socket(arquivo especial que permite a processos se comunicarem).
-p caminho: avalia se é um FIFO (pipe nomeado/ arquivo especial que também tem relação com comunicação entre processos).
-eq: equal/igual.
-ne: not equal/diferente.
-lt: less than/ menor que.
-le: less equal/ menor ou igual.
-gt: greater than/ maior que.
-ge: greater or equal/ maior ou igual.
-z: string vazia.
-n: string não vazia.
=~ :equivale ao ==
Apresentação dos comandos:
test, [ ] e [[ ]]:
Verifica se expressões são verdadeiras(retorna 0) ou falsas(retorna 1 ou um número maior). Digitar test ou [ ] resulta a mesma coisa, mas [[ ]] é a forma que aceita globbing(parecido com regex).
test 8 -eq 8 && echo "números iguais" || echo "números diferentes"
test 8 == 7 && echo "números iguais" || echo "números diferentes"Testa se o último comando usado é ou não builtin do bash:
[[ $? == 0 ]] && echo "é builtin" || echo "não é builtin"Testar se foi passado somente um argumento:
[[ $# -ne 1 ]] && echo “use apenas um argumento”Testar se o argumento passado é um arquivo:
[[ -f arquivo ]] && echo "é arquivo" || "não é arquivo"Testar se o argumento dado é número(aceita vários dígitos):
numero=89898989
[[ ! $numero =~ ^[0–9]+$ ]] && echo "$numero é um número" || echo "nao é numero"if elif else:
Enquanto test testa condições, if testa comandos. Comumente if é usado com test, [ ] ou [[ ]].
sintaxe 1 — completa:
if CONDIÇÃO; then
COMANDOS
elif CONDIÇÃO; then
COMANDOS
else
COMANDOS
fi
numero=12
if (( numero > 10 )); then
echo "$numero é maior que 10"
elif (( numero == 10 )); then
echo "$numero é igual a 10"
else
echo "$numero é menor que 10"
fisintaxe 2 — sem elif:
if COMANDO ; then
COMANDOS
else
COMANDOS
fi
numero1=10
numero2=9
if (( numero1 % 2 == 0 )); then
echo "$numero1 é par"
else
echo "$numero1 é impar"
fi
if (( numero2 % 2 == 0 )); then
echo "$numero2 é par"
else
echo "$numero2 é impar"
fisintaxe 3 — em uma linha só:
if comando1; then comando2; elif comando3; then comando4; else comando5; fi
if ping -c 1 -W 2 1.1.1.1; then echo "ping deu certo"; else echo "ping deu errado"; finumero=5; if (( numero > 15 )); then echo "Maior"; elif (( numero == 15 )); then echo "Igual"; else echo "Menor"; fisintaxe 4 — if puro e com ! para inverter a premissa:
if !COMANDO; then COMANDO; fi
arquivo="/usr/bin/alacritty"
if [[ -f "$arquivo" ]]; then
echo "O arquivo existe"
fi#com ! retorna mensagem caso a condição retorne erro
if ! [[ -f "$arquivo" ]]; then
echo "O arquivo não existe"
fisintaxe 5 — com parênteses(também cria um subshell) ou chaves para agrupar estado de saída. Em grupos, a negação é aplicada na saída do grupo:
if (true; false); then echo 0; else echo 1; fi
if { false; true; } then echo 0; else echo 1; fiif ! (true; false); then echo 0; else echo 1; fi
if ! { false; true; } then echo 0; else echo 1; fiSem grupos, só o último comando é negado:
if ! true; false; then echo 0; else echo 1; fi
if true; ! false; then echo 0; else echo 1; fisintaxe 6 — mais combinações com [[ ]] ou :
if [[ CONDIÇÃO1 ]]; then COMANDO1;
elif [[ CONDIÇÃO2 ]]; then COMANDO2;
Get Linuxmon’s stories in your inbox
Join Medium for free to get updates from this writer.
else COMANDO3; fi
usuario="root"
distro=debian
if [[ ($usuario == "admin" || $usuario == "root") && $distro == "debian" ]]; then
echo "Condições atendidas"
else
echo "Condições não atendidas"
finumero=20
if test "$numero" -gt 10; then
echo "Maior que 10"
else
echo "Menor ou igual a 10"
fiif com excesso de elifs:
distro=cachy
if [[ $distro == arch ]]; then
echo Não gosto desta: $distro
elif [[ $distro == debian ]]; then
echo nao quero esta $distro
elif [[ $str == fedora ]]; then
distro=nix
if [[ $distro == arch ]]; then
echo Não gosto desta: $distro
elif [[ $distro == debian ]]; then
echo nao quero esta $distro
elif [[ $str == fedora ]]; then
echo tambem nao quero a $distro
elif [[ $distro == nix ]]; then
echo $distro é ruim
else
echo nao acertei a distro
fi echo tambem nao quero a $distro
elif [[ $distro == nix ]]; then
echo $distro é ruim
else
echo nao acertei a distro
fidistro=nix
if [[ $distro == arch ]]; then
echo Não gosto desta: $distro
elif [[ $distro == debian ]]; then
echo nao quero esta $distro
elif [[ $str == fedora ]]; then
echo tambem nao quero a $distro
elif [[ $distro == nix ]]; then
echo $distro é ruim
else
echo nao acertei a distro
ficase:
Case serve para substituir o excesso de elifs, sendo uma forma menos verborrágica é preferível aos elifs, também lembra o comando de loops select:
Sintaxe:
case VALOR in
PADRAO1) COMANDOS ;;
PADRAO2) COMANDOS ;;
PADRAO3) COMANDOS ;;
esacExemplos:
periferico=fone
case ${periferico,,} in
mouse)
echo nao quero este $periferico
;;
teclado)
echo ja tenho $periferico.
;;
monitor)
echo estou precisando de ${periferico^}!
;;
*)
echo $periferico desejado nao identificado.
;;
esacperiferico=gabinete
case ${periferico,,} in
mouse)
echo nao quero este $periferico
;;
teclado)
echo ja tenho $periferico.
;;
gabinete)test 8 -eq 8 && echo “sucesso” || echo “erro”
echo estou precisando do ${periferico^}!
;;
*)
echo $periferico desejado nao identificado.
;;
esacDuas opções para ter a mesma saída com pipe:
case $var in
a|A)
echo fez escolha 1
;;
b|B)
echo fez escolha 2
;;
c|C)
echo fez escolha 3
;;
*)
echo qualquercoisa
;;
esacMais alguns comandos:
Testar se é um número e se ele está no intervalo de 1 a 10:
read -rp "Digite um número: " numero
if [[ "$numero" =~ ^[0-9]+$ ]]; then
if [[ "$numero" -ge 0 && "$numero" -le 10 ]]; then
echo "O número $numero está entre 0 e 10."
else
echo "O número$ numero está fora do intervalo de 0 a 10."
fi
else
echo "Erro: você não digitou um número inteiro válido."
fiExibir mensagem se tem ou não arquivo.txt no atual diretório
if ls *txt; then
echo "status $? tem arquivo .txt"
else
echo "status $? não tem arquivo .txt"
fiTestar se a palavra não é uma string vazia e se começa com a letra A:
read -rp "Digite uma palavra: " palavra
if [[ "$palavra" == [aA]* ]]; then
echo "A palavra começa com a ou A."
else
echo "A palavra não começa com a ou A."
fiTestar se a variavel palavra é uma string vazia(-z=string vazia):
palavra=
[[ -z $palavra ]] && echo " é uma string vazia" || "não é string vazia"
palavra="qualquercoisa"
[[ -z $palavra ]] && echo " é uma string vazia" || "não é string vazia"Mais exemplos com case:
perifericos=teclado
case $perifericos in
teclado) echo "$perifericos custa 50 reis" ;;
mouse) echo "$perifericos custa 60 reis" ;;
fone) echo "$perifericos custa 70 reis" ;;
*) echo "$perifericos não encontrado" ;;
esac#!/bin/bash
clear
case $1 in
teclado|cooler) echo "$1 custa 50 reis" ;;
mouse|monitor) echo "$1 custa 60 reis" ;;
fone) echo "$1 custa 70 reis" ;;
*) echo "opção inválida" ;;
esac
#daí deve-se chamar arquivo.sh argumento do contrário retorará opção inválida#!/bin/bash
clear
case $1 in
[tT]eclado|cooler) echo "$1 custa 50 reis" ;;
mouse|monitor) echo "$1 custa 60 reis" ;;
fone|'fone bluetooth') echo "$1 custa 70 reis" ;;
*) echo "opção inválida, $1 não é periférico";;
esac
#daí também deve-se chamar arquivo.sh argumentoJogo de advinhação de número:
#!/bin/bash
numero=$(( RANDOM % 21 ))
echo "===== JOGO DE ADIVINHAÇÃO ====="
echo "0 - Fácil (3 tentativas, com dicas)"
echo "1 - Difícil (2 tentativas, sem dicas)"
read -r -p "Escolha o modo: " modo
if [[ "$modo" == "0" ]]; then
chances=3
facil=true
elif [[ "$modo" == "1" ]]; then
chances=2
facil=false
else
echo "Erro: escolha 0 ou 1."
exit 1
fi
echo
echo "Adivinhe o número entre 0 e 20!"
while (( chances > 0 )); do
read -r -p "Digite seu palpite: " palpite
if [[ ! "$palpite" =~ ^[0-9]+$ ]] || (( palpite > 20 )); then
echo "Erro: digite um número inteiro entre 0 e 20."
continue
fi
if (( palpite == numero )); then
echo "Parabéns! Você acertou!"
echo "O número era: $numero"
exit 0
else
echo "Você errou!"
if [[ "$facil" == true ]]; then
if (( palpite < numero )); then
echo "Dica: o número secreto é MAIOR."
else
echo "Dica: o número secreto é MENOR."
fi
fi
((chances--))
if (( chances > 0 )); then
echo "Tentativas restantes: $chances"
else
echo "Acabaram as tentativas!"
echo "O número secreto era: $numero"
fi
fi
done







