一、for循环语句
1、列表循环
for variable in {list}
do
command
command
...
done
或者
for variable in a b c
do
command
command
done
eg 打印12345
#!/bin/bash
for i in {1..5}
do
echo $i
done
{10..1..-1} 打印10到1
{1..100..2} 打印奇数
{0..100..2} 打印偶数
seq 10 打印1到10
seq 10 -1 1 打印10到1
seq 1 2 10 打印奇数
2、不带列表循环
for variable
do
command
command
...
done
3、类C风格的for循环
for ((expr1;expr2;expr3))
do
command
command
...
done
for ((i=1;i<=5;i++))
do
echo $i
done
expr1:定义变量并赋初值
expr2:决定是否进行循环(条件)
expr3:决定循环变量如何改变,决定循环什么时候退出
4、循环控制语句
循环体do…done之间的内容
continue:继续,表示循环体内的后面代码不执行,重新下一次循环
break:打断,停止循环,执行循环体后面的语句
exit:直接退出脚本
应用练习:
(一)计算100以内的奇数和
#!/bin/env bash
sum=0
for i in {1..100..2}
do
let sum=$sum+$i
done
echo "1-100奇数和为:$sum"
(二)判断输入整数是否为质数
#!/bin/env bash
read -p "请输入一个正整数:" number
[ $number -eq 1 ] && echo "$number不是质数" && exit
[ $number -eq 2 ] && echo "$number是质数" && exit
for i in `seq 2 $[$number-1]`
do
[ $[$number%$i] -eq 0 ] && echo "$number不是质数" && exit
done
echo "$number是质数"
(三)批量创建用户
#!/bin/env bash
grep -w ^class /etc/group &>/dev/null
test $? -ne 0 && groupadd class
for ((i=1;i<=5;i++))
do
useradd -G class u$i
echo 123|passwd --stdin u$i
done
1、批量新建5个用户stu1~stu5,要求用户的家目录在/rhome
#!/bin/bash
[ -f /rhome ] && mv /rhome /rhome.bak || [ ! -d /rhome ] && mkdir /rhome
for ((i=1;i<=5;i++))
do
useradd -d /rhome/stu$i stu$i
echo 123|passwd --stdin stu$i
done
2、局域网内脚本检查主机网络通讯
#!/bin/bash
ip=10.1.1
for ((i=1;i<=10;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
#!/bin/bash
ip=10.1.1
for ((i=1;i<=10;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网络检测完毕"
二、while循环
条件为真进入循环,条件为假退出循环
语法结构
while 表达式
do
command...
done
while [ 1 -eq 1 ] 或者 (( 1 > 2 ))
do
command
command
...
done
eg 脚本计算1-50偶数和
#!/bin/bash
sum=0
i=2
while [ $i -le 50 ]
do
let sum=$sum+$i
let i+=2
done
echo "1-50偶数和为:$sum"
脚本同步系统时间
#!/bin/env bash
NTP=10.1.1.1
count=0
while true
do
rdate -s $NTP &>/dev/null
if [ $? -ne 0 ];then
echo "system date failed" |mail -s "check system date" root@loaclhost
else
let count++
if [$count -eq 100 ];then
echo "system date success" |mail -s "check system date" root@localhost && count=0
fi
fi
sleep 30
done
三、until循环
条件为假进入循环,条件为真退出循环
语法结构
until expression [ 1 -eq 1 ] (( 1>=1 ))
do
command
command
...
done
eg
#!/bin/bash
if [ -d /rhome ];then
echo "/rhome目录已存在"
else
mkdir /rhome
echo "/rhome不存在,已完成创建"
fi
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
useradd -d /rhome/stu$i stu$i
echo 123|passwd --stdin stu$i
fi
let i++
done