#### 題目要求
計算文檔a.txt中每一行中出現的數字個數並且要計算一下整個文檔中一共出現了幾個數字。例如a.txt內容如下:
12aa*lkjskdj
alskdflkskdjflkjj
我們腳本名字為 ncount.sh, 運行它時:
bash ncount.sh a.txt
輸出結果應該為:
2
0
sum:2
#### 參考答案
```
#!/bin/bash sum=0 while read line do line_n=`echo $line|sed 's/[^0-9]//g'|wc -L` echo $line_n sum=$[$sum+$line_n] done < $1 echo "sum:$sum"
當我們輸入的字段比變量數目多時,最后一個變量的值將不只一個字段,而是所有剩余的內容;當輸入字段比變量數少時,多余的變量將是空值,你可以自己試試。現在我們再來看
while read line
do
…
done < file
r
ead通過輸入重定向,把file的第一行所有的內容賦值給變量line,循環體內的命令一般包含對變量line的處理;然后循環處理file的第二行、第三行。。。一直到file的最后一行。還記得while根據其后的命令退出狀態來判斷是否執行循環體嗎?是的,read命令也有退出狀態,當它從文件file中讀到內容時,退出狀態為0,循環繼續驚醒;當read從文件中讀完最后一行后,下次便沒有內容可讀了,此時read的退出狀態為非0,所以循環才會退出。
另一種也很常見的用法:
command | while read line
do
…
done
如果你還記得管道的用法,這個結構應該不難理解吧。command命令的輸出作為read循環的輸入,這種結構長用於處理超過一行的輸出,當然awk也很擅長做這種事。