有這樣乙個需求:
• 迴圈遍歷檔案每一行:流程控制語句
– 定義乙個計數器num
– 列印num正好是檔案行數
目前有四種方法可以解決:
1.for迴圈遍歷
oldifs=$ifs
ifs=$'\n'
num=0
for i in `cat data.txt` ;do
echo $i
((num++))
done
echo num:$num
ifs=$oldifs
因為切割檔案時,空格和回車換行符都會切割,而我們只想要切割回車換行符,所以應該改下ifs,讓它只根據回車換行符切割這樣每次得到的是完整的一行資料。將它原本的設定賦值給乙個變數,迴圈完畢恢復。
遍歷檔案全部內容用cat並用``將命令的結果作為迴圈體,每列印一行資料,行數加1,迴圈完畢,列印num;
2.for迴圈遍歷
num=0
linenum=`cat data.txt | wc -l`
for((i=1;i<=linenum ;i++));do
head -$i data.txt | tail -1
((num++))
done
echo num:$num
獲取檔案的總行數,利用管道和命令替換,用wc獲取全部檔案內容的總行數並賦值給乙個變數linenum,
遍歷,利用head獲取前i行並利用管道檢視最後一行,最終檢視的就是第i行也就是當前行內容,累加,迴圈完畢列印num
3.while迴圈
exec 8<& 0
exec 0< data.txt # instream in = new instream(data.txt)
num=0
while read line ;do
echo $line
((num++))
done
echo num:$num
exec 0<& 8
exec 8<& -
核心思想是將輸入改為檔案一行一行的讀。
定義乙個操作符8指向0標準輸入,為的是迴圈結束後恢復0的標準輸入。
while迴圈 ,read以換行符為切點一行一行的讀。
迴圈結束,列印num,恢復0的輸入為標準輸入
4.while迴圈
簡便寫法:
num=0
while read line ;do
echo $line
((num++))
done 0< data.txt
echo num:$num
注意:!!!
export num=0
cat data.txt | while read line;do
echo $line
((num++))
echo $num
done
echo num:$num
這種寫法會造成num不對。因為管道命令會為左右開闢兩個子程序,右邊子程序結束子變數num銷毀,並不會對主程序變數num產生影響,此時列印主程序num將為初始值0.
8 Linux練習小指令碼
1 顯示統計占用系統記憶體最多的程序,並排序。3 每週的工作日1 30,將 etc備份至 backup目錄中,儲存的檔名稱格式 為 etcbak yyyy mm dd hh.tar.xz 其中日期是前一天的時間 1 寫測試備份命令 root c76 data tar jcvf data bak et...
Linux 常用shell小指令碼
1.計算指令碼運算時間 bin bash st date y m d h m s 運算過程開始 sleep 2 運算過程結束 en date y m d h m s st c date d st s en c date d en s interval expr en c st c echo star...
Python練習小程式 定時關機小指令碼
就不多介紹了,直接上 吧。coding utf 8 import datetime,time,os,wx import tkinter,threading from tkinter import 控制項基礎包 全域性變數 stopflag false winwidth 0 winheight 0 倒...