文章目錄
- 1、shell風格的for,常用in清單方式
- 2、continue與for
- 1、案例:shell風格的for
- 2、案例:c語言風格的for
- 3、案例:檢查内網存活的ip,使用&符号提升腳本的運作效率
- 4、案例:編寫檔案類型測試腳本,支援多個參數
- 5、案例:可以直接在指令行編寫for循環
- 6、案例:統計dev下每種檔案類型的數量
- 7、案例:檢查使用者
- 8、案例:使用者提添加與删除
- 9、案例:使用者建立編寫
- 10、案例:嵌套多層for循環,結合break與continue(了解)
- 11、案列:編寫99乘法表(for)
流程控制之for循環
一、文法
#===========》Shell風格文法
for 變量名 [ in 取值清單 ]
do
循環體
done
#===========》C語言風格文法
for ((初值;條件;步長))
1、shell風格的for,常用in清單方式
for i in 1 2 3
for i in {1,2,3}
for i in {1..9}
for i in {9..1}
for i in {a..z}
for i in {A..Z}
for i in {X..Z}
for i in $(指令) # 例如:for i in $(head -10 /etc/passwd);do echo $i|cut -d: -f1,2;done
for i in $(find ...)
2、continue與for
continue: #預設退出本次(這一次)循環
break: #預設退出本層(整個)循環
二 案例
1、案例:shell風格的for
for i in {1..10}
2、案例:c語言風格的for
for ((i=1;i<=10;i++)) #運用文法條件限制引用變量
3、案例:檢查内網存活的ip,使用&符号提升腳本的運作效率
#!/bin/bash
for i in {1..254} #連續選擇循環引用池内的變量内容
do
(ping -W 1 -c 1 192.168.12.$i &> /dev/null && echo 192.168.12.$i) &
4、案例:編寫檔案類型測試腳本,支援多個參數
[root@egon /]# cat file.sh
#!/bin/bash
for i in $@ #$@表示所有的任意一個或多個
do
if [[ -d $i ]];then #目錄判斷
echo "$i is directory."
elif [[ -b $i ]];then
echo "$i is block device."
elif [[ -f $i ]];then
echo "$i is a regular file."
else
echo "unknow."
fi
done
[root@egon /]# chmod +x file.sh
[root@egon /]#
[root@egon /]# ./file.sh a.txt /etc /root /abc #設定目錄進行查詢(可以一個或多個)
a.txt is a regular file.
/etc is directory.
/root is directory.
unknow.
5、案例:可以直接在指令行編寫for循環
[root@egon /]# for i in {1..10};do [ $i -eq 5 ] && continue || echo $i;done
[root@egon /]# for i in {1..10};do [ $i -eq 5 ] && break || echo $i;done
6、案例:統計dev下每種檔案類型的數量
#!/bin/bash
dir='/dev'
for i in `ls $dir`
do
if [ -b $dir/$i ];then
((block++)) # 或者 let block++,下同
elif [ -f $dir/$i ];then
((file++))
elif [ -d $dir/$i ];then
((directory++))
else
((unkown++))
fi
done
echo 'block' $block
echo 'regular file' $file
echo 'directory' $directory
echo 'unkown'
7、案例:檢查使用者
向腳本傳遞一個使用者名,驗證這個使用者是否存在.
[root@egon ~]# cat testuser.sh
#!/bin/bash
id $1 &> /dev/null
if [ $? -eq 0 ];then
echo "使用者$1存在"
else
echo "使用者$1不存在"
fi
[root@egon ~]# ./testuser.sh root
8、案例:使用者提添加與删除
for i in {1..30};
do
useradd user$i&&echo "user$i create successful"
done
for i in {1..30};
do
userdel -r user$i&&echo "user$i delete successful"
9、案例:使用者建立編寫
[root@egon shell]# cat adduser.sh
#!/bin/bash
read -p "請輸入建立的使用者名資訊: " name
read -p "請輸入建立的使用者數量: " count
for i in `seq -w $count`
do
echo $name$i
useradd $name$i &>/dev/null
echo 123456 | passwd --stdin $name$i &>/dev/null
id $name$i &>/dev/null
[ $? -eq 0 ] && echo "$name$i create is ok" || echo "$name$i create is failed"
10、案例:嵌套多層for循環,結合break與continue(了解)
1)#使用break:
break 預設參數是 1
是以寫 break 等于 break 1
意義:退出目前循環層
break 2 則向上退出2層循環 目前循環也計算在退出層次裡
# 示例
for i in {0..3}
do
echo -e "第一層循環:loop$i"
for j in {0..3}
do
echo -e "\t第二層循環:loop$j"
for n in {0..3}
do
echo -e "\t\t第三層循環:loop$n:$i$j$n"
if ((n==2));then
break 3
fi
done
done
done
2)#使用continue
continue = continue 1
在當次循環中忽略continue後續的代碼
就是:立即結束目前循環中的當次循環,而轉入目前循環的下一次循環
continue 2 等同于 break 1
continue 3 等同于 break 2
總結:continue n 等同于 break n-1
for i in {0..3}
do
echo -e "第一層循環:loop$i"
for j in {0..3}
do
echo -e "\t第二層循環:loop$j"
for n in {0..3}
do
echo -e "\t\t第三層循環:loop$n:$i$j$n"
if ((n==2));then
continue 3
11、案列:編寫99乘法表(for)
#!/bin/bash
for x in {1..9}
do
for y in {1..9}; do
if (( $y <= $x ));then
echo -en "$y*$x=$(($y*$x))\t" #(echo -e \t)相當于tab鍵, (echo -n)取消換行符
let y++
fi
done
echo ""
let x++
done
[root@web01 opt]# sh hzl.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
#案列二
#!/bin/bash
for ((j=1;j<=9;j++))
do
for ((i=1;i<=j;i++))
do
echo -e -n "${i}X${j}=$[${i}*${j}]\t"
done
echo
done
[root@zabbix ~]# sh hzl.sh
1X1=1
1X2=2 2X2=4
1X3=3 2X3=6 3X3=9
1X4=4 2X4=8 3X4=12 4X4=16
1X5=5 2X5=10 3X5=15 4X5=20 5X5=25
1X6=6 2X6=12 3X6=18 4X6=24 5X6=30 6X6=36
1X7=7 2X7=14 3X7=21 4X7=28 5X7=35 6X7=42 7X7=49
1X8=8 2X8=16 3X8=24 4X8=32 5X8=40 6X8=48 7X8=56 8X8=64
1X9=9 2X9=18 3X9=27 4X9=36 5X9=45 6X9=54 7X9=63 8X9=72 9X9=81