for
O for funciona da seguinte forma:
for variavel-indice in lista-de-argumentos; do
<comandos que serão executados até que variavel-indice assuma
todos os valores da lista-de-argumentos>
done
A princípio você pode se sentir um pouco confuso com esse negócio de "lista-de-argumentos", assim como eu também fiquei, mas até que é fácil de entender. Funciona da seguinte forma: a variável usada como índice recebe todos os valores usados na lista de argumentos só que um de cada vez, quando não tiver mais argumentos o for acaba.
Vamos a um exemplo pra você entender direito:
#!/bin/bash
# forsample1.sh
# Exemplo (sem muita utilidade) do uso do comando "for"
echo "Mostra o caminho inteiro de alguns comandos"
for VAR in ls bc grep sed awk; do
which $VAR
done
Pois é! É meio esquisito, eu concordo! Mas é o que nós temos. :) Porém é raro a gente usar esta lista de argumentos deste jeito, passando todos os parâmetros "na mão". Uma maneira mais prática é assim:
#!/bin/bash
# forsample2.sh
if [ $# -lt 1 ]; then
echo "Uso: `basename $0` comando1 [comando2 [comandoN...]]" 1>&2
exit 1
fi
for VAR in $@; do
which $VAR
done
No exemplo acima, nós usamos no for os parâmetros passados na linha de
comando. Existe uma outra maneira que poderíamos ter usado para o mesmo
objetivo. Para isto basta omitirmos o in lista-de-argumentos
. Veja este
exemplo:
#!/bin/bash
# minuscula.sh
# renomeia arquivos que tenham nome em maiusculas para
# o equivalente em minusculas
[ $# -lt 1 ] && {
echo "*** Erro: você precisa passar os arquivos que quer renomear"
echo "Uso: minusculas arquivo1 [arquivoN]"
exit
}
# repare que o for a seguir nao tem o "in lista-de-argumentos"!
for maiuscula
do
[ -e "$maiuscula" ] || {
echo "$maiuscula não existe, continuando com o próximo arquivo"
continue
}
minuscula=$( echo $maiuscula | tr A-Z a-z )
mv $maiuscula $minuscula
done
Agora para usarmos um for um pouco parecido com o das linguagens de
programação convencionais usamos um comandinho chamado seq
. Ele
funciona basicamente da seguinte forma:
$ seq 1 10
1
2
3
4
5
6
7
8
9
10
Pode ser em ordem decrescente também:
$ seq 10 1
10
9
8
7
6
5
4
3
2
1
Fácil não? Agora vejamos um exemplo:
#!/bin/bash
# tabuada.sh
if [ $# -ne 1 ]; then
echo "Uso: `basename $0` n"
echo "Onde 'n' é um número inteiro qualquer"
exit 1
fi
for OP in `seq 1 10`; do
echo -e "$1 + $OP = $[ $1 + $OP ] \t $1 - $OP = $[ $1 - $OP ]"
done
echo
for OP in `seq 1 10`; do
echo -e "$1 * $OP = $[ $1 * $OP ] \t \
$1 / $OP = `echo "scale=2;$1 / $OP" | bc`"
done
Moleza! ;)
"for" como na linguagem C
Se você já é programador C, pode tirar proveito da sintaxe do let
(já
explicado let). Para conferir isto basta pegar o script acima
(tabuada.sh) e trocar as linhas onde tem
for OP in `seq 1 10`; do
por esta linha:
for (( OP=1; OP <= 10; OP++ )); do
Só não pode esquecer dos ((dois parênteses))
.