我的循环的想法是打印文件每一行的第一个数字。文件是这样的:
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,然后说明有多少个 ID(第一列)不以 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"
知道这一点后,您不需要 tempFile 来保存值,只需使用此处文档即可。
使用此处的文档并清理脚本中的一些其他问题:
#!/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 shell 相当古老(~1979 年),并且在更新的 shell(ksh、bash、mksh、zsh 等)中添加了许多改进。