<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                在這關于流程控制的最后一章中,我們將看看另一種 shell 循環構造。for 循環不同于 while 和 until 循環,因為 在循環中,它提供了一種處理序列的方式。這證明在編程時非常有用。因此在 bash 腳本中,for 循環是非常流行的構造。 實現一個 for 循環,很自然的,要用 for 命令。在現代版的 bash 中,有兩種可用的 for 循環格式。 ## for: 傳統 shell 格式 原來的 for 命令語法是: ~~~ for variable [in words]; do commands done ~~~ 這里的 variable 是一個變量的名字,這個變量在循環執行期間會增加,words 是一個可選的條目列表, 其值會按順序賦值給 variable,commands 是在每次循環迭代中要執行的命令。 在命令行中 for 命令是很有用的。我們可以很容易的說明它是如何工作的: ~~~ [me@linuxbox ~]$ for i in A B C D; do echo $i; done A B C D ~~~ 在這個例子中,for 循環有一個四個單詞的列表:“A”,“B”,“C”,和 “D”。由于這四個單詞的列表,for 循環會執行四次。 每次循環執行的時候,就會有一個單詞賦值給變量 i。在循環體內,我們有一個 echo 命令會顯示 i 變量的值,來演示賦值結果。 正如 while 和 until 循環,done 關鍵字會關閉循環。 for 命令真正強大的功能是我們可以通過許多有趣的方式創建 words 列表。例如,通過花括號展開: ~~~ [me@linuxbox ~]$ for i in {A..D}; do echo $i; done A B C D ~~~ 或者路徑名展開: ~~~ [me@linuxbox ~]$ for i in distros*.txt; do echo $i; done distros-by-date.txt distros-dates.txt distros-key-names.txt distros-key-vernums.txt distros-names.txt distros.txt distros-vernums.txt distros-versions.txt ~~~ 或者命令替換: ~~~ #!/bin/bash # longest-word : find longest string in a file while [[ -n $1 ]]; do if [[ -r $1 ]]; then max_word= max_len=0 for i in $(strings $1); do len=$(echo $i | wc -c) if (( len > max_len )); then max_len=$len max_word=$i fi done echo "$1: '$max_word' ($max_len characters)" fi shift done ~~~ 在這個示例中,我們要在一個文件中查找最長的字符串。當在命令行中給出一個或多個文件名的時候, 該程序會使用 strings 程序(其包含在 GNU binutils 包中),為每一個文件產生一個可讀的文本格式的 “words” 列表。 然后這個 for 循環依次處理每個單詞,判斷當前這個單詞是否為目前為止找到的最長的一個。當循環結束的時候,顯示出最長的單詞。 如果省略掉 for 命令的可選項 words 部分,for 命令會默認處理位置參數。 我們將修改 longest-word 腳本,來使用這種方式: ~~~ #!/bin/bash # longest-word2 : find longest string in a file for i; do if [[ -r $i ]]; then max_word= max_len=0 for j in $(strings $i); do len=$(echo $j | wc -c) if (( len > max_len )); then max_len=$len max_word=$j fi done echo "$i: '$max_word' ($max_len characters)" fi done ~~~ 正如我們所看到的,我們已經更改了最外圍的循環,用 for 循環來代替 while 循環。通過省略 for 命令的 words 列表, 用位置參數替而代之。在循環體內,之前的變量 i 已經改為變量 j。同時 shift 命令也被淘汰掉了。 > 為什么是 i? > > 你可能已經注意到上面所列舉的 for 循環的實例都選擇 i 作為變量。為什么呢? 實際上沒有具體原因,除了傳統習慣。 for 循環使用的變量可以是任意有效的變量,但是 i 是最常用的一個,其次是 j 和 k。 > > 這一傳統的基礎源于 Fortran 編程語言。在 Fortran 語言中,以字母 I,J,K,L 和 M 開頭的未聲明變量的類型 自動設為整形,而以其它字母開頭的變量則為實數類型(帶有小數的數字)。這種行為導致程序員使用變量 I,J,和 K 作為循環變量, 因為當需要一個臨時變量(正如循環變量)的時候,使用它們工作量比較少。這也引出了如下基于 fortran 的俏皮話: > > “神是真實的,除非是聲明的整數。” ## for: C 語言格式 最新版本的 bash 已經添加了第二種格式的 for 命令語法,該語法相似于 C 語言中的 for 語法格式。 其它許多編程語言也支持這種格式: ~~~ for (( expression1; expression2; expression3 )); do commands done ~~~ 這里的 expression1,expression2,和 expression3 都是算術表達式,commands 是每次循環迭代時要執行的命令。 在行為方面,這相當于以下構造形式: ~~~ (( expression1 )) while (( expression2 )); do commands (( expression3 )) done ~~~ expression1 用來初始化循環條件,expression2 用來決定循環結束的時間,還有在每次循環迭代的末尾會執行 expression3。 這里是一個典型應用: ~~~ #!/bin/bash # simple_counter : demo of C style for command for (( i=0; i<5; i=i+1 )); do echo $i done ~~~ 腳本執行之后,產生如下輸出: ~~~ [me@linuxbox ~]$ simple_counter 0 1 2 3 4 ~~~ 在這個示例中,expression1 初始化變量 i 的值為0,expression2 允許循環繼續執行只要變量 i 的值小于5, 還有每次循環迭代時,expression3 會把變量 i 的值加1。 C 語言格式的 for 循環對于需要一個數字序列的情況是很有用處的。我們將在接下來的兩章中看到幾個這樣的應用實例。 ## 總結 學習了 for 命令的知識,現在我們將對我們的 sys_info_page 腳本做最后的改進。 目前,這個 report_home_space 函數看起來像這樣: ~~~ report_home_space () { if [[ $(id -u) -eq 0 ]]; then cat <<- _EOF_ <H2>Home Space Utilization (All Users)</H2> <PRE>$(du -sh /home/*)</PRE> _EOF_ else cat <<- _EOF_ <H2>Home Space Utilization ($USER)</H2> <PRE>$(du -sh $HOME)</PRE> _EOF_ fi return } ~~~ 下一步,我們將重寫它,以便提供每個用戶家目錄的更詳盡信息,并且包含用戶家目錄中文件和目錄的總個數: ~~~ report_home_space () { local format="%8s%10s%10s\n" local i dir_list total_files total_dirs total_size user_name if [[ $(id -u) -eq 0 ]]; then dir_list=/home/* user_name="All Users" else dir_list=$HOME user_name=$USER fi echo "<H2>Home Space Utilization ($user_name)</H2>" for i in $dir_list; do total_files=$(find $i -type f | wc -l) total_dirs=$(find $i -type d | wc -l) total_size=$(du -sh $i | cut -f 1) echo "<H3>$i</H3>" echo "<PRE>" printf "$format" "Dirs" "Files" "Size" printf "$format" "----" "-----" "----" printf "$format" $total_dirs $total_files $total_size echo "</PRE>" done return } ~~~ 這次重寫應用了目前為止我們學過的許多知識。我們仍然測試超級用戶(superuser),但是我們在 if 語句塊內 設置了一些隨后會在 for 循環中用到的變量,來取代在 if 語句塊內執行完備的動作集合。我們添加了給 函數添加了幾個本地變量,并且使用 printf 來格式化輸出。 ## 拓展閱讀 * 《高級 Bash 腳本指南》有一章關于循環的內容,其中列舉了各種各樣的 for 循環實例: [http://tldp.org/LDP/abs/html/loops1.html](http://tldp.org/LDP/abs/html/loops1.html) * 《Bash 參考手冊》描述了循環復合命令,包括了 for 循環: [http://www.gnu.org/software/bash/manual/bashref.html#Looping-Constructs](http://www.gnu.org/software/bash/manual/bashref.html#Looping-Constructs)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看