標籤:for shell
前言:日常系統管理工作中有大量需要重複啟動並執行指令,shell編程提供了for、while、until、select迴圈語句以實現特定指令的反覆執行功能,在所有的迴圈語句中,變數必須要有初始值,每次運行命令序列前都需要對條件進行過濾,滿足條件才會運行命令,否則不執行相關操作。下面介紹的就是for迴圈語句的兩種文法格式。
for 迴圈每次處理依次列表內資訊,直至迴圈耗盡。相對於while、until的迴圈方式是必須符合某個條件的狀態,for這種文法是已經知道要進行幾次迴圈的狀態。
文法格式1:
for 變數 in 值1 值2 值3....
do
執行程式
done
說明:for語句通過對變數的定義取值決定迴圈的執行次數,根據變數賦值的次數,for迴圈內的指令將被執行相同的次數,如定義一個變數i取值為2、3、4,則最終for迴圈將迴圈執行命令三次。for語句的文法格式1對變數的賦值通過在in後面直接賦值,多個賦值通過空格隔開。當變數值在列表裡,for迴圈即執行一次所以命令,使用變數名擷取列表中的當前取值。命令可為任何有效shell命令和語句。
in列表可以包含替換、字串和檔案名稱
in列表是可選的,如果不用它,for迴圈使用命令列的位置參數。
簡單for迴圈例子
例1:按順序輸出資料行表中的數字:
[[email protected] sh]# vi for1.sh [[email protected] sh]# cat for1.sh #!/bin/bashfor i in 1 2 3 4 5 ##i是變數,1 2 3 4 5是賦值給變數idoecho $idone[[email protected] sh]# ./for1.sh ##執行結果12345
也可以在迴圈體重結合使用變數名跟字串,如下。
echo "The value is: $i" 輸出結果:The value is: 1The value is: 2The value is: 3The value is: 4The value is: 5
例2:列印字串列表
下面for迴圈中,列表包含字串“orange red blue grey”,命令為echo,變數名為loop,
echo命令使用$loop反饋出列表中所有取值,直至列表為空白。
[[email protected] sh]# vi forloop.sh [[email protected] sh]# cat forloop.sh #!/bin/bashfor loop in orange red blue grey doecho $loopdone[[email protected] sh]# ./forloop.sh ##執行結果orange red blue grey ##在迴圈體重結合使用變數名跟字串
例3:簡易批量解壓縮指令碼(這裡指令碼替換成批量查詢檔案數量)
[[email protected] sh]# vi for2.sh [[email protected] sh]# cat for2.sh #!/bin/bashcd /mnt/sh/ ##先進入到對應目錄下ls *.sh > ls.log ##在sh目錄下,列出以.sh結尾的所有檔案,覆蓋到ls.log檔案中(這裡使用覆蓋,而不是追加,是因為還不確定ls.log這個檔案是否真實存在,如果有就會影響程式執行,所以使用覆蓋)y=1 ##設定變數y=1for i in $(cat ls.log) ##為變數i賦值 cat ls.log的輸出結果doecho $y ##輸出變數y值,輸出一個結果就給y賦值1y=$(( $y + 1 )) ##變數y=變數y+1(雙小括弧,才能進行加減乘除運行算)done[[email protected] sh]# ./for2.sh ##執行結果12345678[[email protected] sh]# ls ##校正執行結果查看有多少.sh結尾的檔案for1.sh for2.sh for3.sh for4.sh if1.sh if2.sh if3.sh if4.sh ls.log[[email protected] sh]#
可以修改為列印目前的目錄下的所有檔案
[[email protected] sh]# cat for5.sh #!/bin/bashfor i in `ls `doecho $idone[[email protected] sh]# ./for5.sh for1.shfor2.shfor3.shfor4.shfor5.shif1.shif2.shif3.shif4.shls.log
文法格式2:
for (( 初始值;迴圈控制條件;變數變化))
do
執行程式
done
說明:文法格式2則是首先通過初始設定變數的值,也就是定義一個變數的初始值,然後通過運算修改變數的值,當結束迴圈的條件滿足時,for迴圈結束。
初始值:某個變數在迴圈前的起始值,直接以類似i=1的方式設定好。
迴圈控制條件:當變數值在這迴圈控制範圍內就可以繼續執行。例如i<=100
變數變化:每做一個迴圈時變數的變化。例如:i=i+1
值得注意的是,在“變數變化”的設定上,如果每次都加1,可以使用類似“i++”的方式,即i每次迴圈都會增加1。可以以這種方式來進行1累加到100的迴圈
例1:從1累加到 100的迴圈
[[email protected] sh]# vi for3.sh [[email protected] sh]# cat for3.sh #!/bin/bashx=0for (( x=1;x<=100;x=x+1 )) ##先初始值x=1分號在執行迴圈控制條件判斷x<=100的時候,在執行變數變化x=x+1doy=$(($y+$x)) ##變數y就等於 變數y+變數xdoneecho "The sum of 1+2+...+100 is:$y" ##當x值小於等於100時,輸出變數y等於變數y加變數x的結果[[email protected] sh]# ./for3.sh The sum of 1+2+...+100 is:5050 ##執行結果[[email protected] sh]#
例2:大量新增指定數量的使用者(if條件判斷與for迴圈結合使用)
[[email protected] sh]# vi for4.sh [[email protected] sh]# cat for4.sh #!/bin/bashread -t 30 -p "input name: " nameread -t 30 -p "input num: " numread -t 30 -p "input password: " password if [ ! -z $name -a ! -z $num -a ! -z $password ]theny=$( echo $num | sed ‘s/^[0-9]*$//g‘ )if [ -z "$y"]thenfor (( i=1;i<=$num;i=i+1 ))douseradd "$name$i" &> /dev/nullecho $password | passwd --stdin "$name$i" &> /dev/nulldonefifi[[email protected] sh]# ./for4.sh input name: zhangsaninput num: 5input password: abc123 [[email protected] sh]# ls /home ##去home家目錄下查看執行結果,有張三使用者說明添加oklost+found zhangsan1 zhangsan2 zhangsan3 zhangsan4 zhangsan5[[email protected] sh]#
read -t 30指定三十秒讀取時間
read -p "input name: " 設定input name: 為讀取值時的提示符
!取反
-z如果這個值為空白 則返回真。加上!表示:有值才能執行下面語句。
-a 邏輯與(同時判斷)
echo $num | sed ‘s/^[0-9]*$//g‘ :輸出變數num結果管道符過濾後,用正則sed判斷輸出的是否是數字,如果是就會把變數結果替換為空白。(在實際生活中,如果你是自己大量新增使用者的,並沒有那麼繁瑣,還去判斷什麼輸入使用者的個數是否是數位,這塊if語句完全可以省略)
-z "$y" :變數y為空白,返回真
i=1;i<=$num;i=i+1 參照 i=1;i<=100;i=i+1 解釋
useradd "$name$i" &> /dev/null:建立使用者自訂變數名+數字,執行結果匯入黑洞
echo $password | passwd --stdin "$name$i" &> /dev/null:輸入密碼管道給自訂變數名+數位使用者,執行結果匯入黑洞
附:read命令簡單介紹
read命令從鍵盤讀取變數的值,通常用在shell指令碼中與使用者進行互動的場合。該命令可以一次讀取多個變數的值,變數和輸入的值都需要使用空格隔開。
文法:read(選項)(參數)
選項:
-p:指定讀取值時的提示符
-t:指定讀取值時的等待時間(秒)
參數:指定讀取值得變數名
本文出自 “NJ小生” 部落格,請務必保留此出處http://qingwl.blog.51cto.com/9853378/1919786
shell學習之for迴圈語句【初學者】