As maravilhas do Shell Script

Pode parecer um assunto batido, mas sempre há cada vez mais pessoas procurando sobre este tipo de informação na internet. Aqui vai uma introdução básica, que visa ensinar os iniciantes sobre as maravilhas de um terminal shell aberto. O Shell Script pode parecer simples, mas é uma ferramenta poderosa para resolver problemas rápidos e práticos.

[ Hits: 161.031 ]

Por: Bryan Garber da Silva em 23/10/2006


Controle de fluxo de execução: condicionais (if e case)



IF


O if é uma ferramenta que permite testar se determinada condição acontece para se executar um determinado conjunto de comandos. A sintaxe básica dele é assim:

if <condição>; then
   comandos
fi


Caso queira se definir um "else" (senão), a sintaxe fica assim:

if <condição1>; then
   comandos1
else
   comandos2
fi


Caso seja necessário colocar outra condição junto com o else, a sintaxe ficará assim:

if <condição1>; then
   comandos1
elif <condição2>; then
   comandos2
fi


É possível colocar várias condições dentro do if. Para isto, utiliza-se && (E lógico) ou || (OU lógico). No caso do &&, os comandos dentro do if somente serão executados se as condições dentro if forem verdadeiras. Já o ||, os comandos serão executados se alguma condição dentro do if for verdadeira. Vejamos um exemplo:

read VAR
if [ $VAR -ge 10 ] && [ $VAR -le 20 ]; then
   echo "Você digitou um número entre 10 e 20!"
else
   echo "$VAR"
fi

O programa escreverá na tela "Você digitou um número entre 10 e 20!" somente se você digitou um número maior ou igual que 10 ("[ var -ge 10 ]") E menor ou igual a 20 ("[ var -le 20 ]"). Caso você digite algo diferente, o programa imprimirá o valor que você digitou.

CASE


O comando case é um pouco difícil de se usar. Também um pouco difícil de se acostumar. Ele compara uma variável passada e vai comparando com cada valor listado. A sintaxe é assim:

case <variável> in
   <algo_para_comparar>1) <comando>1 ; <comando>2 ;;
   <algo_para_comparar>2) <comando>3 ; <comando>4 ;;
   <algo_para_comparar>n) <comando>n ; <comando>n+1 ;;
   *) echo "Você tem de entrar com um parâmetro válido" ;;
esac


Este último "caso" (*) não precisa ser expressado. Ele é usado quando queremos fazer algo quando a variável comparada não é igual a nenhum caso previsto.

Por exemplo:

case $1 in
   "list") echo "Listar!";;
   "ni!") echo "Ni!";;
   *) echo "Não conheço $1";;
esac

Neste exemplo o shell irá avaliar o valor da variável $1 (o primeiro parâmetro por linha de comando passado ao script) e irá comparar primeiramente com "list". Não sendo iguais, ele compara com "ni!", assim por diante, até terminarem todas as condições.

O case é muito útil quando queremos programar um menu com opções. O usuário digita a opção que deseja e o programa escolhe o que fazer através do case.

Página anterior     Próxima página

Páginas do artigo
   1. Iniciando
   2. Variáveis, variáveis especiais e lendo do teclado
   3. O comando test
   4. Controle de fluxo de execução: condicionais (if e case)
   5. Controle de fluxo de execução: laços (loops)
   6. Indo além: Xdialog
Outros artigos deste autor

Teclados USB e Linux

Leitura recomendada

Backup automático em Shell Script

Programando em shell script (conceitos básicos)

Sed - Introdução

Programação com Shell Script

Shell Script para WEB

  
Comentários
[1] Comentário enviado por mlegidio em 23/10/2006 - 05:12h

Gostei muito deste artigo, pelo simples fato dele ter despertado em mim uma curiosidade em melhorar nessa parte. Obrigado pelos links enviados.

abracos
Mlegidio

[2] Comentário enviado por pedemesa em 23/10/2006 - 09:32h

Show de bola! Muito bom mesmo! Vou ler mais sobre o XDialog...

[3] Comentário enviado por balani em 23/10/2006 - 13:54h

Muito bom, bem explicado, vlw

[4] Comentário enviado por texugo89 em 23/10/2006 - 15:23h

O artigo ficou muito bom, bem simples e objetivo...

Mas eu encontrei dois pequenos erros em WHILE:

original:
--------------------
Usando "while" ao invés de "for" fica assim:

i=1
while [ i -le 100 ]; do
echo "$i"
done
--------------------

como deve ficar:
--------------------
Usando "while" ao invés de "for" fica assim:

i=1
while [ $i -le 100 ]; do
echo "$i"
i=$((i+1))
done
--------------------

1. Alteração, como o i é uma variável ele tem que ser declarado juntamento com o $ ficando assim: $i

2. Alteração, no while você deve almentar o valor da variável $i, caso contrário você ficara em um looping eterno e o echo sempre imprimira 1. Para corrigir isso acrescente a seguinte linha após o echo: i=$((i+1))

Abraços,

## T3%U60 ##

[5] Comentário enviado por _luks em 23/10/2006 - 21:15h

parabens,
esse foi um dos melhores tutoriais de sh que ja li na minha vida :D

[6] Comentário enviado por removido em 24/10/2006 - 19:10h

nada de C nem coisas complicadas, use Shell! Adorei, sendo um entusiasta do Shell Linux! Parabéns!!

[7] Comentário enviado por bryan em 25/10/2006 - 16:11h

Muito obrigado pelos elogios. =)
Me esforcei bastante para que ficasse o mais simples e direto o possível.
Obrigado ao texugo pela correção no exemplo do while, acabei me passando nessa... =)

[8] Comentário enviado por douglasdiasn em 08/11/2006 - 10:25h

Muito Simples e Direto

Parabens...

[9] Comentário enviado por xunil em 15/06/2007 - 17:10h

Muito bom!
Gostava de saber se voce sabe como fazer o exemplo do while mas com 0,1 em vez de 1 a incrementar.
Qualquer poderia solucionar minha duvida
http://www.vivaolinux.com.br/perguntas/verPergunta.php?codigo=62760

Obrigado e continue, adorei o artigo!!

[10] Comentário enviado por GilsonDeElt em 22/03/2008 - 21:04h

d+, cara!

os usuários de Shell Script (e até os não-usuários deles, mas que dependem de quem usa) te agradecem

foi o mais simples artigo sobre Shell que eu já li até então!

Congratulations!

[11] Comentário enviado por minduim em 07/04/2009 - 20:40h

como eu converto string para numeros?
Obrigado pela atenção.

#!/bin/bash
tamanho_max=7,4M
t=$(/usr/bin/du -h -s /home/)
total=$(echo $t |cut -f1 -d"/")
echo "$t"
echo "$total"
echo $total+1
if [ ${total} -ge ${tamanho_max} ]
then
echo "maior igual"
else
echo "menor igual"
fi

[12] Comentário enviado por bryan em 08/04/2009 - 10:09h

Tu tens quatro problemas aqui.
Primeiro: se tu quiser usar a variável "tamanho_max" para comparação, tu terá que retirar o M do final, ficando:

tamanho_max="7,4"

Segundo: para garantir igualdade de grandezas na comparação (ou seja, garantir que tu irá comparar megabyte com megabyte), tu terá que alterar o teu comando du para isto:

t=$(/usr/bin/du -shm /home/)

Isto fará com que, no momento do cut para calcular o valor da variável "total", o resultado não tenha um "M " no final. Isto estava acontecendo no teu script original. Caso tu ateste que continua, é só adicionar mais um cut na linha:

total=$(echo $t |cut -f1 -d"/" | cut -f1 -d"M")

Terceiro: sobre teu echo... O shell script não sabe lidar com pontos flutuantes... o que tu deve fazer, para imprimir o valor correto, é usar o bc!

echo $total+1 | bc

Quarto: sobre o if... O -ge do comando test somente sabe compara inteiros. Tu terá que usar da seguinte forma:

if [ ${total} > ${tamanho_max} ] || [ ${total} = ${tamanho_max} ]
then
echo "maior igual"
else
echo "menor"
fi

Sim, tu terá que fazer dessa forma. Infelizmente, o comando test não reconhece ">=", daí tu tem que separar.

É isso. Agora tem que funcionar.
Abraços.

[13] Comentário enviado por Narcochaos em 03/11/2013 - 20:23h

Parabéns man


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts