Sitemap
Linuxmon

Linuxmon

zzz

Bash: if, case e test

8 min readOct 15, 2026

--

Press enter or click to view image in full size

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 ==

Press enter or click to view image in full size

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"
Press enter or click to view image in full size

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"
fi

sintaxe 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"
fi
Press enter or click to view image in full size

sintaxe 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"; fi
numero=5; if (( numero > 15 )); then echo "Maior"; elif (( numero == 15 )); then echo "Igual"; else echo "Menor"; fi

sintaxe 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"
fi
Press enter or click to view image in full size

sintaxe 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; fi
if ! (true; false); then echo 0; else echo 1; fi
if ! { false; true; } then echo 0; else echo 1; fi

Sem 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; fi
Press enter or click to view image in full size

sintaxe 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"
fi
numero=20
if test "$numero" -gt 10; then
echo "Maior que 10"
else
echo "Menor ou igual a 10"
fi
Press enter or click to view image in full size

if 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
fi
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
Press enter or click to view image in full size

case:

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 ;;
esac

Exemplos:

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.
;;
esac
periferico=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.
;;
esac
Press enter or click to view image in full size

Duas 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
;;
esac
Press enter or click to view image in full size

Mais 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."
fi
Press enter or click to view image in full size

Exibir 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"
fi
Press enter or click to view image in full size

Testar 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."
fi
Press enter or click to view image in full size

Testar 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"
Press enter or click to view image in full size

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 argumento
Press enter or click to view image in full size
Press enter or click to view image in full size
Press enter or click to view image in full size

Jogo 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
Press enter or click to view image in full size
Press enter or click to view image in full size

--

--