bash script chamando-se com argumentos diferentes

3

Eu simplesmente não consigo acertar.

O script usa dois argumentos, alvo e comando. Destinos válidos são especificados em uma matriz. Se o alvo for 'all', o script deve percorrer todos os destinos.

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in $targets ; do
        echo $2" --> "$i
        ./$0 $i $2
    done
    exit 0
fi

echo "Target "$1" just received command '"$2"'"

exit 0

Espero a seguinte saída:

$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'
boggle --> bbb
Target bbb just received command 'boggle'
boggle --> ccc
Target ccc just received command 'boggle'
boggle --> ddd
Target ddd just received command 'boggle'

Mas o script sai na primeira iteração:

$ recur all boggle
boggle --> aaa
Target aaa just received command 'boggle'
    
por Lorinc Nyitrai 03.07.2014 / 16:34

3 respostas

5

O problema não está na recursão, está no loop sobre os itens. Se você tentar isso como acima, você não consegue o que espera:

$ targets=(aaa bbb ccc ddd)
$ for i in $targets; do echo $i; done
aaa

Para fazer um loop sobre o array, você precisa gerar uma lista dos itens no array, por exemplo, este link :

Então você tem

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]}; do
        echo $2" --> "$i
        ./$0 $i $2
    done
    exit 0
fi

echo "Target "$1" just received command '"$2"'"

exit 0
    
por 03.07.2014 / 16:57
2

Outros já apontaram, o problema com a sintaxe usada ao acessar uma lista. Mas esse não é o único problema com o seu script. Você também está usando variáveis sem citar. Ao usar $variablename sem aspas, você obterá resultados inesperados, se essa variável contiver algum caractere, o que poderia ser interpretado pelo shell.

Veja como eu alteraria seu script para evitar esses problemas:

#!/bin/bash
# recur.sh

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in "${targets[@]}"; do
        echo "$2 --> $i"
        "$0" "$i" "$2"
    done
    exit 0
fi

echo "Target $1 just received command '$2'"

exit 0

Você deve ter o hábito de sempre colocar o uso da variável dentro de aspas duplas, a menos que você tenha uma boa razão para não fazê-lo.

    
por 03.07.2014 / 18:01
1

O problema é que você não fez o loop de todos os elementos da matriz, apenas um elemento, porque você usou $targets em vez de ${targets[@]} .

Tente esta correção:

targets=('aaa' 'bbb' 'ccc' 'ddd')

if [ "$1" == "all" ] ; then
    for i in ${targets[@]} ; do
        echo $2" --> "$i
        echo "Target "$i" just received command '"$2"'"
    done
fi

exit 0

Você não precisa recursão aqui.

    
por 03.07.2014 / 17:01