linux 迴圈遍歷小指令碼練習

2021-09-19 16:17:05 字數 1562 閱讀 9976

有這樣乙個需求:

• 迴圈遍歷檔案每一行:流程控制語句

– 定義乙個計數器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 倒...