Obtendo não encontrado e erro de substituição ruim

0

Aqui está o meu código de script para encontrar quando o usuário digita n números para descobrir se os números são ímpares ou par, mas eu acho que meus arrays não estão funcionando

#!/bin/sh
echo "Enter the value of n:"
read n
e=0
o=0
while [ $n -gt 0 ]
do
    echo "Enter the number:"
    read a
    t='expr $a % 2'
    if [ $t -eq 0 ]
    then
        even[e]=$a
        e='expr $e + 1'
    else
        odd[o]=$a
        o='expr $o + 1'
    fi
    n='expr $n - 1'
done
echo "The even numbers are ${even[*]}"
echo "The odd numbers are ${odd[*]}"
exit 0

Eu recebo erros como

test.sh: 15: test.sh: odd[o]=1: not found
test.sh: 12: test.sh: even[e]=2: not found
test.sh: 20: test.sh: Bad substitution

Onde está o erro e por que isso acontece?

    
por Sujit Maiti 27.10.2018 / 13:17

1 resposta

2

Você está executando seu script com /bin/sh , que simplesmente não tem suporte para matrizes. O bash shell, por outro lado, possui.

Você também está usando algumas construções um pouco antiquadas, como expr para fazer aritmética.

Aqui está uma versão do script escrito para bash :

#!/bin/bash

read -p 'Enter n: ' n

while (( n > 0 ))
do
    read -p 'Enter number: ' a

    if (( a % 2 == 0 ))
    then
        even+=( "$a" )
    else
        odd+=( "$a" )
    fi
    n=$(( n - 1 ))
done

echo "The even numbers are ${even[*]}"
echo "The odd numbers are ${odd[*]}"

As principais mudanças incluem a correção da linha #! para apontar para bash , usando (( ... )) para avaliação aritmética, $(( ... )) para substituição aritmética, read -p para fornecer ao usuário uma solicitação, +=(...) para adicionar um elemento para uma matriz e remoção de variáveis desnecessárias.

Uma versão não interativa do script que recebe os números da linha de comando:

#!/bin/bash

for number do
    if (( number % 2 == 0 )); then
        even+=( "$number" )
    else
        odd+=( "$number" )
    fi
done

printf 'The even numbers: %s\n' "${even[*]}"
printf 'The odd numbers: %s\n'  "${odd[*]}"

Teste:

$ bash script.sh 1 2 3 4
The even numbers: 2 4
The odd numbers: 1 3
    
por 27.10.2018 / 13:29