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

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

A ideia do meu loop é imprimir o primeiro dígito de cada linha de um arquivo. O arquivo é este:

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 após 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 de consertar isso, pretendo usar o loop while para verificar se o primeiro dígito é quatro ou não e, em seguida, indicar quantos IDs (primeira coluna) não começam com 4.

Não me importo de aprender sobre uma solução mais limpa do que a minha abordagem, mas isso é para uma aula e não acho que aprendemos muito sobre ela. Durante minha jornada, vi muitas coisas semelhantes com o awk, mas ainda não aprendemos nada sobre o awk.

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

Responder1

O que você escreveu nesta linha:

tempFile=`cut -c1 $1`

não cria um arquivo chamado tempFile. Portanto você não pode ler isso.

Você pode alterar essa linha para:

cut -c1 "$1" > tempFile

E um arquivo chamado tempFileserá criado para o while readloop ler. Não use $tempFilenesse loop, pois a variável $tempfileé nula (não existe). Use algo como (sem $):

done < tempFile

Porém, o comando simples cut -c1 "$1"irá escrever todos os primeiros caracteres do arquivo fonte, basta executar isto para vê-lo:

cut -c1 "sourcefile"

Sabendo disso, você não precisa de um tempFile para armazenar os valores, basta usar um documento aqui.

Usando um documento aqui e limpando alguns outros problemas em 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. Neste caso, presumi que você queria shpor causa da menção de Bourne shell. Observe que o shell Bourne original é bastante antigo (~1979) e que muitas melhorias foram adicionadas aos shells mais recentes (ksh, bash, mksh, zsh, etc).

informação relacionada