一、for循环语句
1.1 for循环语句结构
1)列表循环
列表for循环:用于将一组命令执行已知的次数!
语法结构:
for variable in {list}
do
command
command
…
done
或者
for variable in a b c
do
command
command
done
举例说明:
# for var in {1..10};do echo $var;done
# for var in 1 2 3 4 5;do echo $var;done
# for var in `seq 10`;do echo $var;done
# for var in $(seq 10);do echo $var;done
# for var in {0..10..2};do echo $var;done
# for var in {2..10..2};do echo $var;done
# for var in {10..1};do echo $var;done
# for var in {10..1..-2};do echo $var;done
# for var in `seq 10 -2 1`;do echo $var;done
2)不带列表循环
不带列表的for循环:执行时由用户指定参数和参数的个数!
语法结构:
for variable
do
command
command
…
done
举例说明:
#!/bin/bash
for var
do
echo $var
done
echo "脚本后面有$#个参数"
3)类C风格的for循环
基本语法:
for(( expr1;expr2;expr3 ))
do
command
command
…
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出
举例说明:
# for ((i=1;i<=5;i++));do echo $i;done
# for ((i=1;i<=10;i+=2));do echo $i;done
# for ((i=2;i<=10;i+=2));do echo $i;done
2.2 应用示例
1)脚本计算1~100的奇数的和
#!/bin/bash
# 定义变量来保存奇数和
sum=0
#for循环遍历1-100的奇数,并且相加,把结果重新赋值给sum
for i in {1..100..2}
do
let sum=$sum+$i
done
#打印所有奇数的和
echo "1-100的奇数和是:$sum"
控制循环语句的参数:
- continue:继续;表示循环体内的代码不再执行,直接开始下一次循环;
- break:打断;马上停止执行本次循环,执行循环体后的代码;
- exit:表示直接跳出程序;
#!/bin/bash
for i in {1..5}
do
test $i -eq 2 && break || touch /tmp/file$i
done
#当脚本等于2时,停止循环,脚本结束
2)批量创建用户
批量加5个新用户,以u1到u5命名,并统一加一个新组,组名为class,统一改密码为123 !
#!/bin/bash
#判断class组是否存在
grep -w class /etc/group &>/dev/null
[ $? -ne 0 ] && groupadd class
#批量创建5个用户
for i in {1..5}
do
useradd -G class u$i
echo 123|passwd --stdin u$i
done
批量新建5个用户stu1~stu5,要求这几个用户的家目录都在/rhome !
#!/bin/bash
#判断/rhome是否存在
[ -f /rhome ] && mv /rhome /rhome.bak
test ! -f /rhome -a ! -d /rhome && mkdir /rhome
#创建用户,循环5次
for ((i=1;i<=5;i++))
do
useradd -d /rhome/stu$i stu$i
echo 123|passwd --stdin stu$i
done
3)局域网网内脚本检查网络是否可以正常通信
写一个脚本,局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里!
#!/bin/bash
#定义变量
ip=10.1.1
#循环去ping主机的IP
for ((i=1;i<=254;i++))
do
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
done
shell脚本并行处理:
并行执行:
{程序}&表示将程序放到后台并行执行,如果需要等待程序执行完毕再进行下面内容,需要加wait
#!/bin/bash
#定义变量
ip=10.1.1
#循环去ping主机的IP
for ((i=1;i<=254;i++))
do
{
ping -c1 $ip.$i &>/dev/null
if [ $? -eq 0 ];then
echo "$ip.$i is ok" >> /tmp/ip_up.txt
else
echo "$ip.$i is down" >> /tmp/ip_down.txt
fi
}&
done
wait
echo "ip is ok...."
4)判断闰年
输入一个年份,判断是否是润年(能被4整除但不能被100整除,或能被400整除的年份即为闰年)!
#!/bin/bash
read -p "Please input year:" year
if [ $[$year%4] -eq 0 -a $[$year%100] -ne 0 ];then
echo "$year is leap year"
elif [ $[$year%400] -eq 0 ];then
echo "$year is leap year"
else
echo "$year is not leap year"
fi
二、while循环语句
while循环语句的特点:条件为真就进入循环,条件为假就退出循环!
2.1 while循环语法结构
while 表达式
do
command...
done
或者
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
command
...
done
循环打印1~5数字
#for循环打印
for ((i=1;i<=5;i++))
do
echo $i
done
#while循环打印
i=1
while [ $i -le 5 ]
do
echo $i
let i++
done
2.2 应用示例
1)计算1~50偶数的和
#!/bin/bash
#定义变量
sum=0
i=2
#循环打印1-50的偶数和并且计算后重新赋值给sum
while [ $i -le 50 ]
do
let sum=sum+i
let i+=2
done
#打印sum的值
echo "1-50的偶数和为:$sum"
2)脚本同步系统时间
#!/bin/bash
#定义变量
count=0
ntp_server=10.1.1.1
while true
do
rdate -s $ntp-server &>/dev/null
if [ $? -ne 0 ];then
echo "system date failed" |mail -s ‘check system date‘ root@localhost
else
let count++
if [ $[$count%100] -eq 0 ];then
echo "system date successfull" |mail -s ‘check system date‘ root@localhost && count=0
fi
fi
sleep 3
done
三、until循环
until循环特点:条件为假进入循环,条件为真退出循环!
3.1 until循环语句结构
until 表达式
do
command
command
...
done
循环打印1~5数字
#while循环打印
i=1
while [ $i -le 5 ]
do
echo $i
let i++
done
#until循环打印
i=1
until [ $i -gt 5 ]
do
echo $i
let i++
done
3.2 应用示例
1)使用until语句批量创建10个用户,要求stu1—stu5用户的UID分别为1001—1005;
2)stu6~stu10用户的家目录分别在/rhome/stu6—/rhome/stu10
#!/bin/bash
i=1
until [ $i -gt 10 ]
do
if [ $i -le 5 ];then
useradd -u $[1000+$i] stu$i && echo 123|passwd --stdin stu$i
else
[ ! -d /rhome ] && mkdir /rhome
useradd -d /rhome/stu$i stu$i && echo 123|passwd --stdin stu$i
fi
let i++
done