1. 程式人生 > >shell 結構化命令之迴圈

shell 結構化命令之迴圈

在前面說到過shell-結構化命令之跳轉,再來說一說迴圈命令的使用。

一、for命令

下面是bash shell中for命令的基本格式:

for var in list
do 
    commands
done

在每次迭代過程中,變數var會包含列表中的當前值,$var變數包含著這次迭代對應的當前列表項中的值。可以通過以下幾種方式來指定列表:

讀取列表中的值:
最簡單的用法就是,直接指定一系列值,如下:

for1
~

讀取列表中的複雜值:
我們先看以下,執行下面的指令碼會輸出什麼:

#!/bin/bash

for test in I'm very happy today'
s night do echo "The next string is $test" done

可以發現,它將單引號中的字串設別成了一個字元,所以沒有達到我們想要的效果。

for2

有兩種方法可以解決這個問題:

  • 使用轉義字元\
  • 用雙引號“ ”來定義用到的值

for迴圈預設認為每個值都是由空格分割的。

從變數讀取值:
使用起來也是很簡單的,只是先定義了一個變數,如下所示:

for3
~

從命令讀取值:
如下,使用$(command)就可以將命令作為列表讀入for迴圈中。

#!/bin/bash
for file in $(ls)
do
echo "The file/folder is $file" done

這裡顯示了當前目錄下的所有檔案或資料夾名。


更改欄位分隔符:
有個環境變數叫做IFS(internal field separator),即內部欄位分隔符。預設情況下,bash shell將空格、製表符、換行符當做欄位分隔符。可以這樣來修改IFS的值:IFS=,比如,我們可以使用如下程式碼,拆分當前路徑:

#!/bin/bash

IFS.OLD=$IFS
IFS=/

for file in $(pwd)
do
    echo "The path is: $file"
done

如果想使用多個分隔符,直接將其它們在賦值行串起來即可。這裡了使用IFS.OLD=$IFS;IFS=/

先將預設的分隔符儲存起來,使用完畢之後可以將其恢復。


使用萬用字元讀取目錄:
可以在for迴圈中使用萬用字元來處理目錄中的檔案。如下圖所示我們匹配了使用者目錄下所有已test開頭的檔案和資料夾。

for4

稍加修改就可以完成更加強大的功能,比如遍歷某個目錄下的檔案和目錄,並用test命令將其進行分類。

注意:我們可以在資料列表中放入任何東西,比如前面說到的數值、檔案和目錄。


使用C語言分風格的for命令:使用雙小括號
如同我們在shell-結構化命令之跳轉中說到的在if語句重中使用雙小括號來實現高階的數學表示式一樣。for迴圈中也可以使用雙小括號來實現C語言風格的變數引用方式(其實也類似於數學表示式),格式為for(( expression )),這裡的表示式類似於C語言等語言中的。給一個簡單的例子:

for5

二、while&until命令

while命令的格式如下:

while test command
do
    other commands
done

test command這裡和之前if中的test命令一模一樣。

until命令和while的工作方式完全相反,其格式如下:

until test commands
    other commands
done

直到test命令返回退出狀態碼為0時,迴圈才結束;退出狀態碼不為0時,往下執行迴圈。

三、break&continue命令

和其他程式語言中的完全類似:

break用於:

  • 跳出單個迴圈,此迴圈終止
  • 跳出內部迴圈(巢狀迴圈時)
  • 跳出外部迴圈(break n,用n指定外部迴圈的層級)

continue用於:

  • 提前終止某次迴圈,但並不會終止整個迴圈