溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Shell腳本中如何實(shí)現(xiàn)循環(huán)

發(fā)布時(shí)間:2021-10-27 11:43:45 來(lái)源:億速云 閱讀:2080 作者:小新 欄目:系統(tǒng)運(yùn)維

這篇文章主要介紹了Shell腳本中如何實(shí)現(xiàn)循環(huán),具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

for 循環(huán)

Shell 腳本里最簡(jiǎn)單的循環(huán)當(dāng)屬 for 循環(huán),有編程基礎(chǔ)的朋友應(yīng)該都有使用過(guò) for 循環(huán)。最簡(jiǎn)單的 for 循環(huán)如下所示,你只需將變量值依次寫(xiě)在  in 后面即可:

#!/bin/bash  for num in 1 2 3 4 do     echo $num done

如果要循環(huán)的內(nèi)容是字母表里的連續(xù)字母或連續(xù)數(shù)字,那么就可以按以下語(yǔ)法來(lái)寫(xiě)腳本:

#!/bin/bash  for x in {a..z} do     echo $x done

while 循環(huán)

除了 for 循環(huán),Shell 同樣提供了 while 循環(huán)。對(duì)于其它語(yǔ)言,如果你見(jiàn)過(guò) for 循環(huán)卻沒(méi)見(jiàn)過(guò) while  循環(huán),那么你一定是學(xué)了個(gè)假語(yǔ)言。

在 while 循環(huán)里,每進(jìn)行一次循環(huán),條件都會(huì)被判斷一次,來(lái)確定本次循環(huán)是否該繼續(xù)。其實(shí)在循環(huán)次數(shù)比較少的情況下,for 循環(huán)與 while  循環(huán)效果差不多,但如果循環(huán)次數(shù)比較多,比如 10 萬(wàn)次,那么 while 循環(huán)的優(yōu)勢(shì)就體現(xiàn)出來(lái)了。

#!/bin/bash  n=1  while [ $n -le 4 ] do     echo $n     ((n++)) done

循環(huán)套循環(huán)

像其它高級(jí)語(yǔ)言一樣,循環(huán)是可以互相嵌套的。比如下面這個(gè)例子,我們?cè)?while 循環(huán)里再套入一個(gè) for 循環(huán):

#!/bin/bash  n=1  while [ $n -lt 6 ] do     for l in {a..d}     do         echo $n$l     done     ((n++)) done

這個(gè)腳本執(zhí)行的結(jié)果應(yīng)該是 1a, 1b, 1c, 1d, 2a, 2b ... 5d。

循環(huán)的內(nèi)容是變化的

我們上面提到的 for 循環(huán),循環(huán)變量要賦的值都列在了 in 后面的列表里了。但這樣靈活性太差,因?yàn)樵诤芏嗲闆r下,循環(huán)變量要獲得的值是不固定的。

就比如,有個(gè)變量要獲得當(dāng)前系統(tǒng)上所有用戶,但因?yàn)槊颗_(tái)電腦用戶都不一樣,我們根本就沒(méi)辦法將這個(gè)變量寫(xiě)死。

在這種情況下,我們可以使用 ls 命令將 /home 目錄下所有用戶都列出來(lái),然后用循環(huán)變量依次獲取它們。完整代碼如下:

#!/bin/bash  for user in `ls /home` do     echo $user done

當(dāng)然,除了 ls ,Shell 還支持其它命令。比如我們可以使用 date 命令獲取當(dāng)前系統(tǒng)時(shí)間,再依次打印出來(lái):

$ for word in `date` > do >     echo $word > done Thu Apr 9 08:12:09 CST 2020

變量值檢查

我們?cè)谑褂?while  循環(huán)時(shí),經(jīng)常需要判斷一個(gè)變量的值是否大于或者小于某個(gè)數(shù)。有時(shí)候這個(gè)數(shù)也是用另一個(gè)變量來(lái)表示,那么我們就需要判斷這個(gè)變量的值是否是數(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

第一種方法看起來(lái)似乎是個(gè)廢話,但實(shí)際上,-eq 只能用于數(shù)值間判斷,如果是字符串則判斷不通過(guò),所以這就保證了 ans 是個(gè)數(shù)值型變量。

第二種方法是直接使用 Shell 的通配符對(duì)變量進(jìn)行判斷。

第三種方法就更直接了,使用正則表達(dá)式對(duì)變量進(jìn)行判斷。

我們直接來(lái)看一個(gè)例子:

#!/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

在這個(gè)腳本里,我將要循環(huán)的次數(shù)傳入到 ans 變量,然后腳本就具體打印幾次 hello 。為了保證我們傳入的內(nèi)容是數(shù)字,我們使用了 if [ "$ans"  -eq "$ans" ] 語(yǔ)句來(lái)判斷。如果我們傳入的不是數(shù)字,則不會(huì)進(jìn)入 while 循環(huán)。

循環(huán)輸出文本文件內(nèi)容

如果你想按行依次循環(huán)輸出文本文件的內(nèi)容,可以這樣操作:

#!/bin/bash  echo -n "File> " read file n=0  while read line; do   ((n++))   echo "$n: $line" done < $file

在這里,我們使用 read 命令將文本文件的內(nèi)容讀取存入 file 變量,然后再使用重定向(上述腳本最后一行)將 file 內(nèi)容依次傳入 while  循環(huán)處理再打印出來(lái)。

死循環(huán)

有時(shí)候我們需要一直永遠(yuǎn)循環(huán)做某件事,那么我們就可以使用死循環(huán)。達(dá)到這個(gè)目的很簡(jiǎn)單,只需使用 while true 即可。

#!/bin/bash  while true do     echo -n "Still running at "     date     sleep 1 done

在以上這個(gè)腳本里,將每隔 1 秒打印一次 Still running at 具體時(shí)間 ,直到你按 Ctrl + C 終止這個(gè)腳本。

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Shell腳本中如何實(shí)現(xiàn)循環(huán)”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI