<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 2014字,需瀏覽 5分鐘

           ·

          2020-04-10 23:30

          cb519930ab9aef5da2ab8de14e63e14f.webp0006247e30fd0b1a154e8f067250535d.webp


          點擊「閱讀原文」查看良許原創(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
          done

          while 循環(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套程序員必讀資料


          坑位不多,欲加從速

          → 精選技術資料共享

          → 高手如云交流社群

          朋友圈定期送書





          本公眾號全部博文已整理成一個目錄,請在公眾號里回復「m」獲?。?/span>

          推薦閱讀:

          學習Linux經(jīng)典書籍推薦

          又一個Linux發(fā)行版宣告死亡!曾經(jīng)是最好的桌面版BSD操作系統(tǒng)

          微信重大更新!這特么是為上班摸魚開發(fā)的吧.....(附內測地址)


          5T技術資源大放送!包括但不限于:C/C++,Linux,Python,Java,PHP,人工智能,單片機,樹莓派,等等。在公眾號內回復「1024」,即可免費獲取??!


          瀏覽 121
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美性爱内射大奶美女 | 18禁黄网站免费观看 | 日韩性爱大片 | 靠逼视频网站 | 亚洲欧洲v |