循环语句
for a in var1,var2,var3
do
commanddone
当a为var1时执行do中的语句,执行完后,在将var2赋值给a,再一次执行do中的语句,知道结束
#
for b in `seq 20` <--------------产生一组序列0-20do
echo "step:$b"done
#
for c in `seq 80 100`<----------产生一组序列80-100do
echo "step:$b"
done
#
for (( i=0;i<10;i++ )) do echo $i done i=0 ->初始化了循环时候使用的变量i=0,仅仅是第一次进去循环的时候才有用 i<10 -> 继续循环的条件(结束循环的条件) i++ ->每一次循环,变量i的值的变化 i=7 -e tmp.log.6 ;mv tmp.log.6 tmp.log.7 i=6 -e tmp.log.5 ;mv tmp.log.5 tmp.log.6 .... i=2 -e tmp.log.1 ; mv tmp.log.1 tmp.log.2i=1 退出循环
思考:
每次进去循环的时候变量的值是多少,什么时候满足条件继续循环,什么时候退出循环for循环的特点: 一般来说,都是确定循环的次数
例子:
1、输入一个网段,批量判断网段下的所有机器的状态 (ping 。。。) #!/bin/bash#输入一个网段,批量判断网段下的所有机器的状态 (ping 。。。)
file1=/df/shell/201004071/down file2=/df/shell/201004071/up[ ! -f "$file1" ] && touch "$file1" || echo > "$file1"
[ ! -f "$file2" ] && touch "$file2" || echo > "$file2"for a in `seq 1 254`
do
ip=$1.$a ping -c 2 $ip 2>/dev/null 1>/dev/null [ $? -eq 0 ] && echo "$ip" >> "$file2" || echo "$ip" >> "$file1"done
echo "server is up:"&& cat "$file2"
echo "server is down" && cat "$file1"
2、把系统中所有帐号都分类===================Administrator=================
root ===================System Users================== bin ..... ===================Normal Users================== tom mary .....#!/bin/bash
for a in $( cat /etc/passwd | cut -d: -f1,3 ) # bin:1 .... do name=$( echo $a | cut -d: -f1 ) uid=`echo $a | cut -d: -f2` #echo $uid sleep 1 [ $uid -eq 0 ] && echo -ne "$name\t" >> /tmp/admin_user.txt [ $uid -gt 0 -a $uid -lt 500 ] && echo -ne "$name\t" >> /tmp/system_users.txt [ $uid -ge 500 ] && echo -ne "$name\t" >> /tmp/normal_users.txt doneclear
echo "===================Administrator=================" cat /tmp/admin_user.txt && rm -f /tmp/admin_user.txt echo echo "===================System Users==================" cat /tmp/system_users.txt && rm -f /tmp/system_users.txt echo echo "===================Normal Users==================" cat /tmp/normal_users.txt && rm -f /tmp/normal_users.txt echo3、批量建立用户 user1 ~ user10
----------------------------------------
while [ condition ]
do command donewhile (( condition ))
do command donewhile true # 死循环
do command done
break 终止循环体
-----------------------------------------
#!/bin/bash
#控制循环的流程
# break continue exit for (( i=0 ; i<10 ; i++ )) do echo $i [ $i -eq 8 ] && break # 当i=8的时候,就退出整个循环,执行循环之后的代码 echo "$i After break " #当break之后,就不再执行本句代码 doneecho "Out of Cycle: Can you see me?"
echo "=============================="
j=0 while true do echo $j let j++ [ $j -eq 8 ] && continue # 结束本次循环,不继续执行循环体剩下的代码,而是继续进去下一次循环 echo "@_@" [ $j -eq 12 ] && break doneecho "Out of while"
-----------------------------------------#!/bin/bash
# 添加了流程控制的猜数字 answer=99while true
do read -p "Input your guest:" guest if [ $guest -lt $answer ];then echo "Your guest is too small" continue fiecho "Step1: Can you See me?"
if [ $guest -gt $answer ];then
echo "Your answer is too big" continue fi echo "Step2: Can you see me?" if [ $guest -eq $answer ];then echo "You are right! " break fiecho "Step3: Can you see me?"
done
echo "Out of while"
--------------------------------------------
#!/bin/bash
# script.sh 16:00:00
time=$1 # 16:00:00while true
do now=$(date +%H:%M:%S) clear echo $now if [ "$now" == $time ];then for (( i=0;i<10;i++ )) do echo -en "\a" sleep 1 done break fidone
-------------------------------------------
#!/bin/bash
#画规律图形
#1 #12 #123 #1234 #12345 a=1 # 用来记录当前打印的行号while [ $a -le 5 ]
do for (( c=1;c<=$a;c++ )) do echo -n "$c" done let a++ echo doneecho -e "==========================\n\n"
#1 #23 #456 #78910a=1 # 用来记录当前打印的行号
b=1 # 记录上次打印到的哪个数字while [ $a -lt 5 ]
do for (( c=1;c<=$a;c++,b++ )) do echo -n $b done let a++ echo done----------------------------------------
#1
#23 #345 #4567 #56789--------------------------------------------------------------------
#!/bin/bash echo $RANDOM# 产生一个到0-99范围内的随机数字
ran=`expr $RANDOM % 100` echo $ran # 产生一个50-100范围内的随机数字ran2=`expr $RANDOM % 51 + 50`
echo $ran2 ---------------------------------------------------------------------作业:
1、编写一个脚本把当前目录下的所有空文件都删除,最后输出删除的文件的个数2、创建一个/tmp/test目录,里面有3个文件,名字分别为111,222,333。写一个脚本,可以每个10秒钟循环对这3个文件进行改名,把111改成222,把222改成333,把333改成111。
3、找到/usr/share/doc目录下的所有文件名字为index.html的文件,包括子目录里的。把他们集中复制一份放到/tmp/index目录中,文件名按找到的先后顺序更改,第一个找到的index.html命名为index.html.1 ,第二个找到的为index.html.2。如此类推。
4、备份前24小时被修改过的文件,要求把文件都放到一个tar包里,tar包的命名为YYYYMMDD.tar (如:20091110.tar),最终的tar包存放在/tmp/backup目录下
5、编写一个猜数字游戏:要求脚本随机产生一个 0 到 100的数字,然后交互模式要求你进行猜测,每次猜测都会根据你的判断缩小范围,如: 随机数字为 88
你进行第一次猜测,输入 50,那么脚本会提示你答案就在 50-100的范围里,然后要求继续猜 第二次猜测,输入90,那么脚本会提示你答案就在50 - 90的范围内,如此类推,直到你猜中为止。6、时间允许的话,最后做本题,画三角形
直角三角形 x xx xxx xxxx xxxxx xxxxxx xxxxxxx xxxxxxxx xxxxxxxxx ======================================= 直角空心三角形 x xx x x x x x x x x x x x x x x xxxxxxxxxx ======================================= 等腰三角形 x xxx xxxxx xxxxxxx xxxxxxxxx xxxxxxxxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxx ======================================= 等腰空心三角形 x x x x x x x x x x x x x x x x x xxxxxxxxxxxxxxxxxxx