循环语句
for a in var1,var2,var3
do
command
done
当a为var1时执行do中的语句,执行完后,在将var2赋值给a,再一次执行do中的语句,知道结束
#
for b in `seq 20` <--------------产生一组序列0-20
do
echo "step:$b"
done
#
for c in `seq 80 100`<----------产生一组序列80-100
do
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.2
i=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
done
clear
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
echo
3、批量建立用户 user1 ~ user10
----------------------------------------
while [ condition ]
do
command
done
while (( condition ))
do
command
done
while 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之后,就不再执行本句代码
done
echo "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
done
echo "Out of while"
-----------------------------------------
#!/bin/bash
# 添加了流程控制的猜数字
answer=99
while true
do
read -p "Input your guest:" guest
if [ $guest -lt $answer ];then
echo "Your guest is too small"
continue
fi
echo "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
fi
echo "Step3: Can you see me?"
done
echo "Out of while"
--------------------------------------------
#!/bin/bash
# script.sh 16:00:00
time=$1 # 16:00:00
while 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
fi
done
-------------------------------------------
#!/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
done
echo -e "==========================\n\n"
#1
#23
#456
#78910
a=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