Linux Shell腳本之for循環

for循環是編程語言中一種開界的循環語句,而循環語句[1] 由循環體及循環的終止條件兩部分組成。

for 循環的基本格式

for 變量名 in 列表;do
    循環體
done
  1. 執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
  2. 列表生成方式:
    1. 直接給出列表
    2. 整數列表:{start..end}, $(seq [start [step]] end)
    3. 返回列表的命令:$(COMMAND)
    4. 使用glob通配符,如:*. sh
    5. 變量引用

for循環的一些例子

  1. 直接給出列表
for i in 1 2 3;do                         #寫了一個變量 “i”,列表寫了3個參數,
echo "$i"                                 #打印一下i這個變量的值
done                                      #for循環結束

執行結果

[root@CentOS7.3 bin]#bash -x for.sh       #用bash -x來執行腳本,并查看過程
+ for i in 1 2 3                         
+ echo 1                                  #可以看到第一次賦值是1
1 
+ for i in 1 2 3
+ echo 2                                  #第二次賦的值是2
2
+ for i in 1 2 3                      
+ echo 3                                  #第三次的值是3
3                                         #只有3個值所以循環了三次
[root@CentOS7.3 bin]#

2.整數型列表:計算100以內所有能被3整除的整數之和

sum=0                                      #先寫一個變量sum并賦值0
for i in {1..100};do                       #變量名“i”,列表用{1..100}
if [[ $i%3 -eq 0 ]];then                   #用if判斷“i”變量的值除以3的余數等不等于0
    let sum+=i                             #如果余數等于0,“sum”的值就和“i”的值相加
  fi                                       #if判斷結束
done                                       #for循環結束
 echo "100以內所有能被3整除的整數的和是$sum"   #打印“sum”變量的值
unset sum i                                #刪除變量

執行結果。由于過程比較長,所以忽略了一些過程

[root@CentOS7.3 bin]#bash -x for.sh      #用bash -x來執行腳本,并查看過程
+ sum=0
+ for i in '{1..100}'                    #第一次循環
+ [[ 1%3 -eq 0 ]]                        #比對
+ for i in '{1..100}'                    #1除以3的有余數,所以直接進入第二次循環
+ [[ 2%3 -eq 0 ]]
+ for i in '{1..100}'
+ [[ 3%3 -eq 0 ]]                        #3除以3的余數等于0
+ let sum+=i                             #執行let
+ for i in '{1..100}'
+ [[ 4%3 -eq 0 ]]
+ for i in '{1..100}'
+ [[ 5%3 -eq 0 ]]
+ for i in '{1..100}'
+ [[ 6%3 -eq 0 ]]
+ let sum+=i
+ for i in '{1..100}'
+ [[ 7%3 -eq 0 ]]
+ for i in '{1..100}'
+ [[ 8%3 -eq 0 ]]
+ for i in '{1..100}'
+ [[ 9%3 -eq 0 ]]
+ let sum+=i
+ echo 100以內所有能被3整除的整數的和是1683 #打印結果
+ 100以內所有能被3整除的整數的和是1683
+ unset sum i                               #刪除變量

注:{1..100}表示展開1到100

[root@CentOS7.3 app]#echo {1..10}       #打印1dao10
1 2 3 4 5 6 7 8 9 10                    #效果

3.命令的結果生成的列表:判斷/etc目錄下的文件的類型

for i in `ls /app/*`;do                  #如果要用命令生成列表要加反向單引號 
    if [ -f  "$i" ]                      #判斷$i的值是不是一個普通文件
       then echo "$i 是一個普通文件"      #是普通文件就標準輸出到屏幕
         sleep 0.5                       #停頓0.5秒
    elif [ -d "$i" ];then                #判斷$i的值是不是一個目錄 
       echo "$i 是一個目錄"               #是目錄就標準輸出到屏幕
        sleep 0.5                        #停頓0.5秒
    fi
done

執行結果

[root@CentOS7.3 app]#bash -x for.sh     #用bash -x來執行腳本,并查看過程
++ ls /app/backup.sh /app/logbackup.sh /app/meminfo.sh 
+ for i in '`ls /app/*`'
+ '[' -f /app/backup.sh ']'
+ echo '/app/backup.sh 是一個普通文件'
/app/backup.sh 是一個普通文件
+ sleep 0.5
+ for i in '`ls /app/*`'
+ '[' -f /app/logbackup.sh ']'
+ echo '/app/logbackup.sh 是一個普通文件'
/app/logbackup.sh 是一個普通文件
+ sleep 0.5
+ for i in '`ls /app/*`'
+ '[' -f /app/meminfo.sh ']'
+ echo '/app/meminfo.sh 是一個普通文件'
/app/meminfo.sh 是一個普通文件
+ sleep 0.5

4.使用通配符

for i in  /ect*;do                        #用通配符
    if [ -f  "$i" ]
       then echo "$i 是一個普通文件" 
         sleep 0.5
    elif [ -d "$i" ];then
       echo "$i 是一個目錄"
        sleep 0.5
    fi
done

執行結果

[root@CentOS7.3 app]#bash -x for.sh       
+ for i in '/etc/*'
+ for i in '`ls /app/*`'
+ '[' -f /app/backup.sh ']'
+ echo '/app/backup.sh 是一個普通文件'
/app/backup.sh 是一個普通文件
+ sleep 0.5
+ for i in '`ls /app/*`'
+ '[' -f /app/logbackup.sh ']'
+ echo '/app/logbackup.sh 是一個普通文件'
/app/logbackup.sh 是一個普通文件
+ sleep 0.5
+ for i in '`ls /app/*`'
+ '[' -f /app/meminfo.sh ']'
+ echo '/app/meminfo.sh 是一個普通文件'
/app/meminfo.sh 是一個普通文件
+ sleep 0.5

5.引用變量來生成列表

for i in "$@" ;do                          #用系統變量$@,建議如果要引用變量要加雙引號
    if [ -f  "$i" ]
       then echo "$i 是一個普通文件" 
         sleep 0.5
    elif [ -d "$i" ];then
       echo "$i 是一個目錄"
        sleep 0.5
    fi
done

執行結果

[root@CentOS7.3 app]#bash -x /app/for.sh /boot   #輸入一個參數/boot
+ for i in '"$@"'
+ '[' -f /boot ']'                               #這里顯示/boot,引用變量成功
+ '[' -d /boot ']'
+ echo '/boot 是一個目錄'
/boot 是一個目錄
+ sleep 0.5

注:$@是一個特殊變量,作用是傳遞給腳本或函數所有輸入的參數。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容