Bourne Shell do while loop retorna todos os dados, mas tem dois erros sem tal arquivo ou diretório e repete o nome do shell

1

A idéia do meu loop é imprimir o primeiro dígito de cada linha de um arquivo. O arquivo sendo assim:

256-56-8411     Bob     3.61    Junior          CS
471-44-7458     Tim     3.45    Senior          CE
326-56-4286     Rajesh  2.97    Freshman        TE
548-66-1124     Eric    2.88    Sophomore       EE
447-21-3599     John    2.51    Junior          CS
911-41-1256     Rebecca 3.92    Senior          CS
854-22-6372     Robin   2.45    Freshman        TE

E a saída depois de executar o script é:

    This is a script that analyses student data from input file students.txt
----------------------------------------------------------------------
./student_script: line 8: 2
4
3
5
4
9
8: No such file or directory
7 is the number of students in the input file.

E, por último, o código é:

echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount='wc -l < $1 '
tempFile='cut -c1 $1'
while read n
do
echo "$n"
done < $tempFile

echo "$studentCount is the number of students in the input file."

Depois que eu consertar isso, planejo usar o loop while para verificar se o primeiro dígito é um quatro ou não e, em seguida, declarar quantos ID's (primeira coluna) não iniciam com um 4.

Eu não me importo de aprender sobre uma solução mais limpa do que a minha abordagem, mas isso é para uma aula e eu não acho que tenhamos aprendido muito. Durante a minha jornada eu vi um monte de coisas parecidas com o awk, mas ainda não aprendemos nada de estranho.

Mas sim, basicamente eu consegui todos os dados que eu queria do meu loop, exceto que adicionou esses dois bits extras.

    
por Shawn 14.02.2016 / 07:37

1 resposta

1

O que você escreveu nesta linha:

tempFile='cut -c1 $1'

não cria um arquivo chamado tempFile . Portanto, você não pode ler a partir dele.

Você pode alterar essa linha para:

cut -c1 "$1" > tempFile

E um arquivo chamado tempFile será criado para o loop while read ler. Não use $tempFile nesse loop, pois a variável $tempfile é nula (não existe). Use algo como (no $):

done < tempFile

No entanto, o comando simples cut -c1 "$1" irá escrever todos os primeiros caracteres do arquivo de origem, apenas execute isto para ver:

cut -c1 "sourcefile"

Sabendo disso, você não precisa de um tempFile para manter os valores, apenas use um documento aqui.

Usando um documento aqui e limpando alguns outros problemas no seu script:

#!/bin/sh
echo "This is a script that analyses student data from input file $1"
echo "----------------------------------------------------------------------"
studentCount="$(wc -l < "$1" )"

while read n
do
    echo "$n"
done <<-_avoid_a_file_
$(cut -c1 "$1")
_avoid_a_file_

echo "$studentCount is the number of students in the input file."

É uma boa prática usar um she-bang (#!) para indicar qual interpretador deve executar o código. Nesse caso, presumi que você queria sh devido à menção de Bourne shell . Observe que o shell Bourne original é bem antigo (~ 1979) e que muitas melhorias foram adicionadas a shells mais recentes (ksh, bash, mksh, zsh, etc).

    
por 14.02.2016 / 08:15