Цикл Bourne Shell do while возвращает все данные, но имеет две ошибки: такого файла или каталога нет, и повторяет имя оболочки

Цикл Bourne Shell do while возвращает все данные, но имеет две ошибки: такого файла или каталога нет, и повторяет имя оболочки

Идея моего цикла — вывести первую цифру каждой строки файла. Файл такой:

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

А вывод после запуска скрипта такой:

    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.

И наконец, код:

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."

После того, как я это исправлю, я планирую использовать цикл while для проверки, является ли первая цифра четверкой или нет, а затем указать, сколько идентификаторов (первый столбец) не начинаются с цифры 4.

Я не против узнать о более чистом решении, чем мой подход, но это для класса, и я не думаю, что мы многому научились. Во время своего путешествия я видел много похожего с awk, но мы пока вообще не изучили awk.

Но да, по сути я получил все необходимые данные из своего цикла, за исключением того, что он добавил два дополнительных бита.

решение1

То, что вы написали в этой строке:

tempFile=`cut -c1 $1`

не создает файл с именем tempFile. Поэтому вы не можете читать из него.

Вы можете изменить эту строку на:

cut -c1 "$1" > tempFile

И файл с именем tempFileбудет создан для while readчтения в цикле. Не используйте $tempFileв этом цикле, так как переменная $tempfilenull (не существует). Используйте что-то вроде (без $):

done < tempFile

Однако простая команда cut -c1 "$1"запишет все первые символы из исходного файла, просто выполните ее, чтобы увидеть это:

cut -c1 "sourcefile"

Зная это, вам не нужен временный файл для хранения значений, просто используйте документ here.

Использование документа here и устранение некоторых других проблем в вашем скрипте:

#!/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."

Хорошей практикой является использование she-bang (#!) для указания того, какой интерпретатор должен запустить код. В этом случае я предположил, что вы хотели, shиз-за упоминания Bourne shell. Обратите внимание, что исходная оболочка Bourne довольно старая (~1979) и что в более поздние оболочки (ksh, bash, mksh, zsh и т. д.) было добавлено много улучшений.

Связанный контент