shell 結構化命令之迴圈
在前面說到過shell-結構化命令之跳轉,再來說一說迴圈命令的使用。
一、for命令
下面是bash shell中for命令的基本格式:
for var in list
do
commands
done
在每次迭代過程中,變數var會包含列表中的當前值,$var變數包含著這次迭代對應的當前列表項中的值。可以通過以下幾種方式來指定列表:
讀取列表中的值:
最簡單的用法就是,直接指定一系列值,如下:
~
讀取列表中的複雜值:
我們先看以下,執行下面的指令碼會輸出什麼:
#!/bin/bash
for test in I'm very happy today' s night
do
echo "The next string is $test"
done
可以發現,它將單引號中的字串設別成了一個字元,所以沒有達到我們想要的效果。
有兩種方法可以解決這個問題:
- 使用轉義字元\
- 用雙引號“ ”來定義用到的值
for迴圈預設認為每個值都是由空格分割的。
從變數讀取值:
使用起來也是很簡單的,只是先定義了一個變數,如下所示:
~
從命令讀取值:
如下,使用$(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開頭的檔案和資料夾。
稍加修改就可以完成更加強大的功能,比如遍歷某個目錄下的檔案和目錄,並用test命令將其進行分類。
注意:我們可以在資料列表中放入任何東西,比如前面說到的數值、檔案和目錄。
使用C語言分風格的for命令:使用雙小括號
如同我們在shell-結構化命令之跳轉中說到的在if語句重中使用雙小括號來實現高階的數學表示式一樣。for迴圈中也可以使用雙小括號來實現C語言風格的變數引用方式(其實也類似於數學表示式),格式為for(( expression ))
,這裡的表示式類似於C語言等語言中的。給一個簡單的例子:
二、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用於:
- 提前終止某次迴圈,但並不會終止整個迴圈