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)).

results matching ""

    No results matching ""