for循環是編程語言中一種開界的循環語句,而循環語句[1] 由循環體及循環的終止條件兩部分組成。
for 循環的基本格式
for 變量名 in 列表;do
循環體
done
- 執行機制:依次將列表中的元素賦值給“變量名” ; 每次賦值后即執行一次循環體; 直到列表中的元素耗盡,循環結束
- 列表生成方式:
- 直接給出列表
- 整數列表:{start..end}, $(seq [start [step]] end)
- 返回列表的命令:$(COMMAND)
- 使用glob通配符,如:*. sh
- 變量引用
for循環的一些例子
- 直接給出列表
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
注:$@是一個特殊變量,作用是傳遞給腳本或函數所有輸入的參數。