Ajuda com o script a ler números de um arquivo e a determinar se são números pares ou ímpares

2

Por isso, quero que meu script teste a existência de um arquivo que já preenchi com números. Ele faz isso, mas depois disso eu quero que ele seja executado por um tempo. Verifique se os números no arquivo são ímpares ou até mesmo quando ele verifica cada número em cada linha. Por tudo o que sei, a estrutura do meu script é ruim, mas o código que eu tenho abaixo não produz um resultado desejado.

exist=rnddata.txt
if [ -f $exist ]; then
 echo "file exist processing"
else
 echo "file does not exist"
exit1
fi
while read exist
do
if [ $((exist % 2)) -eq 0 ]; then
 echo "even"
else
echo "odd"
fi
done
exit
    
por David Prentice 10.11.2015 / 01:15

2 respostas

2

Tente isto:

while read number
do
    if [ $((number % 2)) -eq 0 ]; then 
        echo even
    else    
        echo odd 
    fi      
done < "$exist"

read lê as variáveis em sua linha de comando. Então você tem que alimentar os dados do arquivo no loop, então read pode obtê-lo. Aqui fazemos isso com o < "$exist" após o done do loop while .

O comando read não possui uma página manpage porque é um shell embutido. Para ver como funciona, digite man sh (sugestão, procure readonly porque é muito mais fácil de encontrar).

    
por 10.11.2015 / 01:25
0

na maioria das vezes você não precisa se preocupar com coisas como:

if    [ -e "$file" ]
then  echo exists
else  echo not exists
fi

quando as pessoas fazem esse tipo de coisa, elas estão apenas girando as rodas. também pode ser problemático, pois há pouco para se conectar entre o comportamento e o formato de saída de um script em relação ao outro. e todo esforço é desperdiçado de qualquer maneira porque:

sh -c 'exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file

um shell POSIX com script morre com causa gravada em stderr quando um shell especial embutido é o objeto de qualquer redirecionamento de shell com falha. os builtins especiais são:

: continue break exec set . shift unset
times trap exit export readonly eval return

seu status especial pode ser rebaixado chamando-os via command :

sh -c 'command exec <not_exist; echo can i\?' my_zero
my_zero: 1: my_zero: cannot open not_exist: No such file
can i?

e, portanto, a estratégia mais direta e eficaz para lidar de maneira robusta com arquivos de leitura / gravação é colocar o arquivo diretamente no descritor de arquivo com o qual você pretende interagir e deixar o shell manipular qualquer saída de erro como necessário. isso só acontecerá se for necessário e se você escrever seus scripts com um olho para permitir que as ações falem por si mesmos.

sh -c '
    cat_fname()
        for   f
        do    exec   <"$f"
              printf "\n%-5s%-$((${#f}+2))s%s\n" === "$f" ===
              cat
        done
    cat_fname a[1-9]/a[1-9].txt not_exist /dev/fd/0'
===  a1/a1.txt  ===
1 1 1 11 1 1 1 1

===  a2/a2.txt  ===
2 2 2 12 2 2 2 2

===  a3/a3.txt  ===
3 3 3 13 3 3 3 3

===  a4/a4.txt  ===
4 4 4 14 4 4 4 4

===  a5/a5.txt  ===
5 5 5 15 5 5 5 5

===  a6/a6.txt  ===
6 6 6 16 6 6 6 6

===  a7/a7.txt  ===
7 7 7 17 7 7 7 7

===  a8/a8.txt  ===
8 8 8 18 8 8 8 8

===  a9/a9.txt  ===
9 9 9 19 9 9 9 9
sh: 4: cannot open not_exist: No such file
    
por 10.11.2015 / 07:04