Bourne Shell do while 循环返回所有数据,但有两个错误,没有这样的文件或目录,并重复 shell 名称

Bourne Shell do while 循环返回所有数据,但有两个错误,没有这样的文件或目录,并重复 shell 名称

我的循环的想法是打印文件每一行的第一个数字。文件是这样的:

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 等)中添加了许多改进。

相关内容