不論是哪一門計算機語言,循環都是不可繞開的一個話題,Shell 固然也不是例外。下面總結一些 Shell 腳本里經常使用的循環相關的知識點,新手朋友能夠參考。linux
Shell 腳本里最簡單的循環當屬 for
循環,有編程基礎的朋友應該都有使用過 for 循環。最簡單的 for 循環以下所示,你只需將變量值依次寫在 in 後面便可:git
#!/bin/bash for num in 1 2 3 4 do echo $num done
若是要循環的內容是字母表裏的連續字母或連續數字,那麼就能夠按如下語法來寫腳本:面試
#!/bin/bash for x in {a..z} do echo $x done
除了 for 循環,Shell 一樣提供了 while
循環。對於其它語言,若是你見過 for 循環卻沒見過 while 循環,那麼你必定是學了個假語言。正則表達式
在 while 循環裏,每進行一次循環,條件都會被判斷一次,來肯定本次循環是否該繼續。其實在循環次數比較少的狀況下,for 循環與 while 循環效果差很少,但若是循環次數比較多,好比 10 萬次,那麼 while 循環的優點就體現出來了。編程
#!/bin/bash n=1 while [ $n -le 4 ] do echo $n ((n++)) done
像其它高級語言同樣,循環是能夠互相嵌套的。好比下面這個例子,咱們在 while 循環裏再套入一個 for 循環:bash
#!/bin/bash n=1 while [ $n -lt 6 ] do for l in {a..d} do echo $n$l done ((n++)) done
這個腳本執行的結果應該是 1a, 1b, 1c, 1d, 2a, 2b ... 5d。.net
咱們上面提到的 for 循環,循環變量要賦的值都列在了 in 後面的列表裏了。但這樣靈活性太差,由於在不少狀況下,循環變量要得到的值是不固定的。code
就好比,有個變量要得到當前系統上全部用戶,但由於每臺電腦用戶都不同,咱們根本就沒辦法將這個變量寫死。字符串
在這種狀況下,咱們可使用 ls 命令將 /home 目錄下全部用戶都列出來,而後用循環變量依次獲取它們。完整代碼以下:get
#!/bin/bash for user in `ls /home` do echo $user done
固然,除了 ls ,Shell 還支持其它命令。好比咱們可使用 date 命令獲取當前系統時間,再依次打印出來:
$ for word in `date` > do > echo $word > done Thu Apr 9 08:12:09 CST 2020
咱們在使用 while 循環時,常常須要判斷一個變量的值是否大於或者小於某個數。有時候這個數也是用另外一個變量來表示,那麼咱們就須要判斷這個變量的值是不是數字。有三種判斷方法:
#!/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
只能用於數值間判斷,若是是字符串則判斷不經過,因此這就保證了 ans 是個數值型變量。
第二種方法是直接使用 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
在這個腳本里,我將要循環的次數傳入到 ans 變量,而後腳本就具體打印幾回 hello 。爲了保證咱們傳入的內容是數字,咱們使用了 if [ "$ans" -eq "$ans" ]
語句來判斷。若是咱們傳入的不是數字,則不會進入 while 循環。
2020 精選 阿里/騰訊等一線大廠 面試、簡歷、進階、電子書 公衆號「良許Linux」後臺回覆「資料」免費獲取
若是你想按行依次循環輸出文本文件的內容,能夠這樣操做:
#!/bin/bash echo -n "File> " read file n=0 while read line; do ((n++)) echo "$n: $line" done < $file
在這裏,咱們使用 read 命令將文本文件的內容讀取存入 file 變量,而後再使用重定向(上述腳本最後一行)將 file 內容依次傳入 while 循環處理再打印出來。
有時候咱們須要一直永遠循環作某件事,那麼咱們就可使用死循環。達到這個目的很簡單,只需使用 while true
便可。
#!/bin/bash while true do echo -n "Still running at " date sleep 1 done
在以上這個腳本里,將每隔 1 秒打印一次 Still running at 具體時間
,直到你按 Ctrl + C 終止這個腳本。