Comparando duas variáveis inteiras

0

Eu quero imprimir dois iteradores chamados i e j de aninhados for loops sempre que eles não forem iguais. A mensagem de erro:

syntax error near unexpected token 'then'

#!/bin/bash
read n
array=()
for i in 'seq 1 $n'
do
    read num
    array+=$num
done

count=0
count2=0
countmax=0
for i in 'seq 1 $n'; do
    for j in 'seq 1 $n'; do
        if [ $i -ne $j ]; then
            echo $i $j
        fi
    done
done

O que eu fiz de errado?

    
por YuZ 20.12.2017 / 23:08

2 respostas

1

What have I done wrong?

Em nenhuma ordem particular,

  • Você não tem #!/bin/bash ou equivalente como primeira linha.
  • Parece que você não postou o script real que está falhando. (O que você tem aqui é sintaticamente correto.)
  • Você não citou duas vezes suas variáveis, "$n" em vez de $n .
  • Você está usando backticks obsoletos para avaliação em vez de $( ...) .
  • Você não testou seu código no link
  • Você não recuou seus blocos de código para facilitar a leitura.
  • Se você estiver adicionando elementos a uma matriz, use array+=($num) . O que você tem em seu código é a concatenação de string para o último elemento.
  • No (novo) primeiro bloco você atribui aos elementos (0 .. n-1), mas depois você usa elementos (1 .. n).
  • No (novo) segundo bloco, você está comparando os índices de desigualdade em vez dos elementos da matriz. Você quis comparar "${array[$i]}" -ne "${array[$j]}" (ou, para o (( ... )) construct, array[i] != array[j] )?

(Eu provavelmente gostaria de salientar que algumas delas são boas práticas e não regras de codificação essenciais.)

Aqui está o seu código com as minhas sugestões aplicadas:

#!/bin/bash
read -p 'Number of elements: ' n

array=(0)    # We don't use element zero
for i in $(seq "$n")
do
    read -p 'Element: ' num
    array+=($num)
done

for i in $(seq "$n")
do
    for j in $(seq "$n")
    do
        # Compare the array elements rather than the indices
        # Is this what you intended?
        if (( array[i] != array[j] ))
        then
            echo "${array[$i]} ${array[$j]}"
        fi
    done
done
    
por 20.12.2017 / 23:16
0

Eu também eliminaria o uso de seq usando loops for:

#!/bin/bash

read -p 'Number of elements: ' n

array=(0)
for (( i = 1; i <= n; i++ ))
do
    read -p 'Element: ' num
    array+=("$num")
done

for (( i = 1; i <= n; i++ ))
do
    for (( j = 1; j <= n; j++ ))
    do
        (( array[i] != array[j] )) && echo "${array[i]} ${array[j]}"
    done
done
    
por 21.12.2017 / 11:50

Tags