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 tempFile
será criado para o while read
loop ler. Não use $tempFile
nesse 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 sh
por 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).