Para loop no script bash [closed]

2

O seguinte loop for no bash dá um erro -

line 42: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")

linha 42 é declaração - num1 = $ [$ i1 + 1]

for i1 in 'seq 1 5'
    do
    num1=$[$i1 + 1]
        for k1 in 'seq $num1 5'
        do
        ky1="${team_two[i1]}_${team_two[k1]}"
        pair_score[$ky1]=$[${pair_score[$ky1]}+1]
        done
    done

O que há de errado com o código?

EDITAR

Eu recebo a seguinte saída na depuração

++ seq 1 5
+ for i1 in ''seq 1 5''
/home/ashwin/bin/calculate_power: line 43: 1
2
3
4
5 + 1: syntax error in expression (error token is "2
3
4
5 + 1")

Novamente, é a mesma afirmação que a linha 43 - num1 = $ [$ i + 1]

    
por Ashwin 17.04.2014 / 08:25

2 respostas

4

Parece que você tem alguns problemas com seu ${team_two[*]} & ${team_two[k1]} arrays ou você mexeu com os caracteres de separação na variável especial $IFS . Você pode ativar a depuração do Bash adicionando um set -x antes de inserir o loop for externo. Em seguida, desative-o depois com um set +x para obter mais insights.

set -x
... for loop block ...
set +x

Exemplo

Quando executo seu código pelo Bash dessa maneira, recebo a seguinte saída:

$ bash -x for.bash 
++ seq 1 5
+ for i1 in ''seq 1 5''
+ num1=2
++ seq 2 5
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=1
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=2
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=3
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=4
+ for i1 in ''seq 1 5''
+ num1=3
++ seq 3 5
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=5
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=6
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=7
+ for i1 in ''seq 1 5''
+ num1=4
++ seq 4 5
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=8
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=9
+ for i1 in ''seq 1 5''
+ num1=5
++ seq 5 5
+ for k1 in ''seq $num1 5''
+ ky1=_
+ pair_score[$ky1]=10
+ for i1 in ''seq 1 5''
+ num1=6
++ seq 6 5

Editar # 1

Depois de mais atualizações, parece que você redefiniu $IFS . Normalmente, você vai querer salvar $IFS em uma variável secundária antes de redefini-la, e a reverterá mais tarde no valor original.

IFSOLD=$IFS
IFS=,

... do IFS , stuff here ...

IFS=$IFSOLD

IFS

Se você tentar esses exemplos, eles poderão ajudar a esclarecer o impacto que o $IFS pode reproduzir quando usado em um script.

Digamos que eu tenha a seguinte variável:

$ var="1,2,3,4,5"

Agora vamos analisar e imprimir a primeira variável, $c1 :

$ IFS=',' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1

No entanto, se alterarmos nosso $IFS para um espaço.

$ IFS=' ' read -r c1 c2 c3 c4 c5 <<< "$var"
$ echo "$c1"
1,2,3,4,5

Portanto, no segundo exemplo, configuramos o comando read via $IFS para dividir em espaços, em vez de vírgulas.

    
por 17.04.2014 / 08:54
3

Nada (fundamentalmente) errado com esse código, seu problema é que você redefiniu o "IFS" em algum outro lugar, provavelmente está vazio (então a saída de seq é tratada como um único token) .

Tempo longo desde que eu vi $[] , é obsoleto (e não documentado). Use $(( )) .

Em vez de seq use for (( )) e, em vez de adicionar 1, use let var++ , então temos:

for (( i1=1 ; i1<=5; i1++))
    do
        for ((k1=i1+1; k1<=5; k1++))
            do
                ky1="${team_two[i1]}_${team_two[k1]}"
                let pair_score[$ky1]++
            done
    done    

Como você está usando um bash recente com matrizes associativas, também pode usar os outros recursos interessantes: -)

    
por 17.04.2014 / 11:22