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.
O for cria um laço de execução enquanto uma determinada condição é verdadeira. A sintaxe dele é simples:
for((<variável>=<valor_inicial>; <condição_a_ser_testada>; <variável>++/--));
do
<comandos>
done
Para ficar mais claro, vamos ilustrar com um exemplo: eu quero um programa que imprima na tela os números de 1 a 100. O script ficará assim:
for((i=1; i <= 100; i++));
do
echo "$i"
done
i=1 quer dizer que o valor inicial da variável i vai ser 1. Lembre-se de não adicionar nenhum espaço entre a variável e o "=" e também entre o "=" e o valor a ser atribuído.
i <= 100 quer dize que, enquanto o valor da variável "i" for menor que 100, os comandos dentro do for serão executados.
i++ quer dizer que você está incrementando em 1 o valor da variável "i" a cada laço executado (cada vez que completa as operações dentro do for).
O for tem um recurso bastante bom quando se quer iterar uma lista. Por exemplo: se eu quero iterar entre os nomes dentro de um diretório, basta eu escrever o for desta maneira:
for <nome_da_variável> in *;
do
<comandos>
done
Isto fará com que o for itere dentro do nome dos arquivos dentro de um diretório. O valor da variável será o nome do arquivo atual.
WHILE
O while é um comando muito parecido com o for. Enquanto uma condição for verdadeira, ele executará os comandos dentro do laço. A sintaxe é assim:
while <condição>; do
<comando>1
<comando>2
<comando>n
done
Vamos ver como exemplo uma transformação do exemplo anterior. Ele estava assim:
[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))
[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... =)
[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.