Идея моего цикла — вывести первую цифру каждой строки файла. Файл такой:
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
в этом цикле, так как переменная $tempfile
null (не существует). Используйте что-то вроде (без $):
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 и т. д.) было добавлено много улучшений.