for循环结构
列表式循环
根据变量的不同取值,重复执行不同序列
for语法格式 for 变量名 in 变量值列表; do 当变量值列表有值赋给变量名时执行的语句块 done
例子1:
#!/bin/bash #for i in 1 2 3 4 5 6 7 8 9 10 #for i in `head /etc/passwd` for i in `ls /shell/*.sh` do echo $i done
把192.168.1.1~192.168.1.5主机的ip地址输出到屏幕上
#!/bin/bash mynet=192168.1. #for i in 1 2 3 4 5 #for i in `seq 254` #for i in `30 45` #for i in `seq 10 2 30` #for i in {a..z} for i in {1..10} do echo $mynet$i done
例子2:
#!/bin/bash for i in `seq 10` do if [ `expr $i % 2` -eq 0 ];then echo $i fi done
用for循环输出192.168.1.0/24网段内所有主机的ip地址
#!/bin/bash for I in `seq 1 254` do echo 192.168.1.$I done
把自己不能与其通信的本网段的主机的ip地址输出到屏幕上
并统计不能与其通信的主机的个数
#!/bin/bash j=0 mynet=192.168.1 for i in `seq 5` do ping -c 3 $mynet.$i &> /dev/null if [ $? -ne 0 ];then echo "$mynet.$i" let j++ fi done echo "不在的主机有 $j 台"
例子3:
#!/bin/bash mynet=192.168.1 for i in `seq 5` do (ping -c 3 $mynet.$i &> /dev/null if [ $? -ne 0 ];then echo "主机 $mynet.$i not line!!!" fi) & done
注意:
() 把当前的程序放到子shell里执行
& 把程序置入后台运行
把1-20之间的偶数输出 并统计奇数的个数。
#!/bin/bash for s in `seq 20` do if [ `expr $s % 2` -eq 0 ];then echo $s let j++ fi done echo "共有$j个奇数"
把系统已有的binlog日志文件输出
方法1
#!/bin/bash mysqldir=/var/lib/mysql cd $mysqldir for i in `cat localhost-bin.index` do binlogname=`basename $i` echo $binlogname done
方法2:
#!/bin/bash for binlog in `cat /var/lib/mysql/data-bin.index` do echo $binlog done
方法3:
#!/bin/bash for binlog in `cat /var/lib/mysql/data-bin.index` do binlogname=`basename $binlog` echo $binlogname done
每天的 23:30 备份当前数据库服务器上新生成的binlog日志文件到系统的/newbinlogdir目录里. (当前正在使用binlog日志文件不备份)
#!/bin/bash datadir=/var/lib/mysql bakdir=/mysqlbak lastbinlogname=`tail -1 $datadir/mysqld-bin.index | awk -F"/" '{print $2}'` if [ -e $bakdir ];then cd $datadir for i in `cat mysqld-bin.index ` do binlogname=`basename $i` if [ "$binlogname" != "$lastbinlogname" ];then if [ ! -e $bakdir/$binlogname ];then cp $binlogname $bakdir else echo "$binlogname baked" fi else echo "$lastbinlogname useeing!!!!" fi done else mkdir $bakdir cd $datadir for i in `cat mysqld-bin.index ` do binlogname=`basename $i` if [ "$binlogname" != "$lastbinlogname" ];then if [ ! -e $bakdir/$binlogname ];then cp $binlogname $bakdir else echo "$binlogname baked" fi else echo "$lastbinlogname useeing!!!!" fi done fi
C语言风格的for循环
通过变量控制,条件成立时循环 步长可控次数 for((赋初值;条件判断;步长))
例子:
for((i=5;i==3;i++)) do echo $i sleep 1 done
使用for循环嵌套实现九九乘法表
#!/bin/bash #通过for循环嵌套实现九九乘法表,其中temp用于保存i+j的值 for (( i = 1;i <=9; i++ )) do #內层循环 for (( j=1; j <=i; j++ )) do let "temp = i * j" #暂时存储i*j的值 echo -n "$i*$j=$temp " done echo "" done
使用for循环嵌套实现8X8个的棋盘
#!/bin/bash #外层循环 for (( i = 1;i <=8; i++ )) do #內层循环 for (( j=1; j <=8; j++ )) do #下面两行用于不重叠显示黑白格 total=$(( $i + $j )) tmp=$(( $total % 2 )) if [ $tmp -eq 0 ]; then echo -e -n "