Shell腳本關于循環(huán)的一些總結


點擊「閱讀原文」查看良許原創(chuàng)精品視頻。
不管是哪一門計算機語言,循環(huán)都是不可繞開的一個話題,Shell 當然也不是例外。下面總結一些 Shell 腳本里常用的循環(huán)相關的知識點,新手朋友可以參考。
for 循環(huán)
Shell 腳本里最簡單的循環(huán)當屬 for 循環(huán),有編程基礎的朋友應該都有使用過 for 循環(huán)。最簡單的 for 循環(huán)如下所示,你只需將變量值依次寫在 in 后面即可:
#!/bin/bash
for?num?in?1?2?3?4
do
????echo?$num
done
如果要循環(huán)的內容是字母表里的連續(xù)字母或連續(xù)數(shù)字,那么就可以按以下語法來寫腳本:
#!/bin/bash
for?x?in?{a..z}
do
????echo?$x
donewhile 循環(huán)
除了 for 循環(huán),Shell 同樣提供了 while 循環(huán)。對于其它語言,如果你見過 for 循環(huán)卻沒見過 while 循環(huán),那么你一定是學了個假語言。
在 while 循環(huán)里,每進行一次循環(huán),條件都會被判斷一次,來確定本次循環(huán)是否該繼續(xù)。其實在循環(huán)次數(shù)比較少的情況下,for 循環(huán)與 while 循環(huán)效果差不多,但如果循環(huán)次數(shù)比較多,比如 10 萬次,那么 while 循環(huán)的優(yōu)勢就體現(xiàn)出來了。
#!/bin/bash
n=1
while?[?$n?-le?4?]
do
????echo?$n
????((n++))
done循環(huán)套循環(huán)
像其它高級語言一樣,循環(huán)是可以互相嵌套的。比如下面這個例子,我們在 while 循環(huán)里再套入一個 for 循環(huán):
#!/bin/bash
n=1
while?[?$n?-lt?6?]
do
????for?l?in?{a..d}
????do
????????echo?$n$l
????done
????((n++))
done
這個腳本執(zhí)行的結果應該是 1a, 1b, 1c, 1d, 2a, 2b … 5d。
循環(huán)的內容是變化的
我們上面提到的 for 循環(huán),循環(huán)變量要賦的值都列在了 in 后面的列表里了。但這樣靈活性太差,因為在很多情況下,循環(huán)變量要獲得的值是不固定的。
就比如,有個變量要獲得當前系統(tǒng)上所有用戶,但因為每臺電腦用戶都不一樣,我們根本就沒辦法將這個變量寫死。
在這種情況下,我們可以使用 ls 命令將 /home 目錄下所有用戶都列出來,然后用循環(huán)變量依次獲取它們。完整代碼如下:
#!/bin/bash
for?user?in?`ls?/home`
do
????echo?$user
done
當然,除了 ls ,Shell 還支持其它命令。比如我們可以使用 date 命令獲取當前系統(tǒng)時間,再依次打印出來:
$?for?word?in?`date`
>?do
>?????echo?$word
>?done
Thu
Apr
9
08:12:09
CST
2020變量值檢查
我們在使用 while 循環(huán)時,經(jīng)常需要判斷一個變量的值是否大于或者小于某個數(shù)。有時候這個數(shù)也是用另一個變量來表示,那么我們就需要判斷這個變量的值是否是數(shù)字。有三種判斷方法:
#!/bin/bash
echo?-n?"How?many?times?should?I?say?hello??"
read?ans
if?[?"$ans"?-eq?"$ans"?];?then
????echo?ok1
fi
if?[[?$ans?=?*[[:digit:]]*?]];?then
????echo?ok2
fi
if?[[?"$ans"?=~?^[0-9]+$?]];?then
????echo?ok3
fi
第一種方法看起來似乎是個廢話,但實際上,-eq 只能用于數(shù)值間判斷,如果是字符串則判斷不通過,所以這就保證了 ans 是個數(shù)值型變量。
第二種方法是直接使用 Shell 的通配符對變量進行判斷。
第三種方法就更直接了,使用正則表達式對變量進行判斷。
我們直接來看一個例子:
#!/bin/bash
echo?-n?"How?many?times?should?I?say?hello??"
read?ans
if?[?"$ans"?-eq?"$ans"?];?then
??n=1
??while?[?$n?-le?$ans?]
??do
????echo?hello
????((n++))
??done
fi
在這個腳本里,我將要循環(huán)的次數(shù)傳入到 ans 變量,然后腳本就具體打印幾次 hello 。為了保證我們傳入的內容是數(shù)字,我們使用了 if [ "$ans" -eq "$ans" ] 語句來判斷。如果我們傳入的不是數(shù)字,則不會進入 while 循環(huán)。
循環(huán)輸出文本文件內容
如果你想按行依次循環(huán)輸出文本文件的內容,可以這樣操作:
#!/bin/bash
echo?-n?"File>?"
read?file
n=0
while?read?line;?do
??((n++))
??echo?"$n:?$line"
done?$file
在這里,我們使用 read 命令將文本文件的內容讀取存入 file 變量,然后再使用重定向(上述腳本最后一行)將 file 內容依次傳入 while 循環(huán)處理再打印出來。
死循環(huán)
有時候我們需要一直永遠循環(huán)做某件事,那么我們就可以使用死循環(huán)。達到這個目的很簡單,只需使用 while true 即可。
#!/bin/bash
while?true
do
????echo?-n?"Still?running?at?"
????date
????sleep?1
done
在以上這個腳本里,將每隔 1 秒打印一次 Still running at 具體時間 ,直到你按 Ctrl + C 終止這個腳本。
END
良許個人微信
添加良許個人微信即送3套程序員必讀資料
→坑位不多,欲加從速
→ 精選技術資料共享
→ 高手如云交流社群
→朋友圈定期送書
推薦閱讀:
又一個Linux發(fā)行版宣告死亡!曾經(jīng)是最好的桌面版BSD操作系統(tǒng)
微信重大更新!這特么是為上班摸魚開發(fā)的吧.....(附內測地址)
5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內回復「1024」,即可免費獲取??!
