我的循環的想法是列印文件每一行的第一個數字。文件是這樣的:
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 等)中添加了許多改進。