一、for循环
用法:
for 变量 in 取值列表
do
命令序列
done
例1:打印1到10的数字列表
#!/bin/bash
for i in {1..10}
do
echo $i
done
例2:#批量添加用户,用户名存放在users.txt文件中,每行一个,初始密码均设为123456
#!/bin/bash
userfile=/root/users.txt
for name in $(cat $userfile)
do
useradd $name
echo 123456 | passwd --stdin $name &> /dev/null
done
echo "批量添加用户完成"
例3:
根据IP地址检查主机状态 IP地址存放在ipadds.txt文件中,每行一个 使用ping命令检测各主机的连通性
#!/bin/bash
#根据IP地址检查主机状态 IP地址存放在ipadds.txt文件中,每行一个 使用ping命令检测各主机的连通性
filepath=/root/for/ipadds.txt
for hostip in $(cat $filepath)
do
ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
if [ $? -eq 0 ];then
echo "$hostip is online" >> /root/for/result.txt
else
echo "$hostip is offline">> /root/for/result.txt
fi
done
例4:
根据IP地址检查主机状态 使用ping命令检测 192.168.80.10 20 30 40 50 60主机的连通性
#!/bin/bash
#根据IP地址检查主机状态 使用ping命令检测 192.168.80.10 20 30 40 50 60主机的连通性
for num in {1..6}
do
hostip="192.168.80.${num}0"
ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
if [ $? -eq 0 ];then
echo "$hostip is online"
else
echo "$hostip is offline"
fi
done
例5:
输出1到10的整数,并判断奇偶数
#!/bin/bash
#输出1到10的整数,并判断奇偶数
for ((i=1; i<=10; i++))
do
a=$[i % 2]
if [ $a -eq 1 ];then
echo "$i 为奇数"
else
echo "$i 为偶数"
fi
done
例6:
根据IP地址检查主机状态 使用ping命令检测 192.168.80.0~255 的主机,获取在线的主机清单
#!/bin/bash
#根据IP地址检查主机状态 使用ping命令检测 192.168.80.0~255 的主机,获取在线的主机清单
for num in {0..255}
do
{
hostip="192.168.80.$num"
ping -c 4 -i 0.5 -W 2 $hostip &> /dev/null
if [ $? -eq 0 ];then
echo "$hostip is online" >> /root/host.txt
fi
}&
done
wait
cat /root/host.txt
例7:
输出1到10的整数,并判断奇偶数
#!/bin/bash
#输出1到10的整数,并判断奇偶数
for ((i=1; i<=10; i++))
do
a=$[i % 2]
if [ $a -eq 1 ];then
echo "$i 为奇数"
else
echo "$i 为偶数"
fi
done
例8:
求1到10的和
#!/bin/bash
#求1到10的和
sum=0
for ((i=1; i<=10; i++))
{
sum=$[sum + $i]
}
echo "1到10的和为 $sum"
例9:
输出PATH环境变量的目录里所有以xy开头的文件
#!/bin/bash
#输出PATH环境变量的目录里所有以xy开头的文件
IFS_OLD=$IFS
IFS=$IFS':'
for i in $PATH
do
#ls $i/xy* 2> /dev/null
find $i -name "xy*" -print 2> /dev/null
done
例10:
求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始每一项等于前两项之和,打印前10个元素
#!/bin/bash
#求裴波拉切数:1,1,2,3,5,8,13,21,34,55,89...,数列从第3项开始每一项等于前两项之和,打印前10个元素
first=1
second=1
for ((i=1; i<=10; i++))
do
echo $first
C=$[first + second]
first=$second
second=$C
done
例11:
自动生成一个8位数的随机密码,密码范围可以是小大写字母和数字
#!/bin/bash
#自动生成一个8位数的随机密码,密码范围可以是小大写字母和数字
STR="0123456789shicaijundashuaigeABCDEFGHIJKLMNOPQRSTUVWXYZ"
for ((i=1; i<=8; i++))
do
#获取字符串所有下标的随机数
num=$[RANDOM % ${#STR}]
#根据随机下标获取一个随机字符
passd=${STR:num:1}
#将随机字符进行拼接
password+=$passd
done
echo "8位随机密码为 $password"
例12
用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不存在,提示用户输入密码,建立用户并设立其密码
#!/bin/bash
#用户名存放在users.txt文件中,每行一个,判断文件里的用户是否存在,若该用户存在,输出提示该用户已存在;用户存在但没设密码,则提示用户并让用户设置密码:若该用户不存在,提示用户输入密码,建立用户并设立其密码
usrfile=/root/users.txt
#循环遍历文件里的每行用户
for iname in $(cat $usrfile)
do
#判断是否存在
grep "^$iname" /etc/passwd &> /dev/null
if [ $? -eq 0 ];then
echo "$iname 用户已存在"
#判断用户是否设置密码
userpasswd=$(cat /etc/shadow | grep "^$iname" | awk -F: '{print $2}')
if [ "$userpasswd" == "!!" ] || [ "$userpasswd" == "*" ] || [ -z "$userpasswd" ];then
echo "$iname 用户没设密码。"
read -p "请设置 $iname 用户的密码:" pd1
read -p "请确认设置 $iname 用户的密码:" pd2
if [ "$pd1" == "$pd2" ];then
echo $pd1 | passwd --stdin $iname &> /dev/null
else
echo "密码输入不正确,放弃设置...."
fi
fi
else
#创建不存在的用户并设置密码
echo "$iname 用户不存在,正常创建用户....."
read -p "请设置 $iname 用户的密码:" password1
read -p "请确认设置 $iname 用户的密码:" password2
if [ "$password1" == "$password2" ];then
useradd $iname
echo $password1 | passwd --stdin $iname &> /dev/null
else
echo "密码输入不正确,放弃设置...."
fi
fi
done
二、while循环
格式:
while 条件测试操作
do
命令序列
done
例1:
提示用户输入一个小于100的整数,并计算从1到该数之间所有整数的和
#!/bin/bash
read -p "请输入一个100以内的数:" i
a=1
sum=0
if [ $i -ge 1 ] && [ $i -le 100 ];then
while [ $a -le $i ]
do
let sum+=a
let a++
done
echo "1到$i的总和为$sum"
else
echo "重新输入"
fi
例2:
求1~100所有整数的偶数和、奇数和
#!/bin/bash
a=1
oddsum=0
evensum=0
while [ $a -le 100 ]
do
b=$[ a%2 ]
if [ $b -eq 0 ];then
let evensum+=$a
else
let oddsum+=$a
fi
let a++
done
echo " 奇数为$oddsum,偶数为$evensum"
例3:
测试指定范围主机是否通信,并将通信主机的Ip写到host_ip文件中
#!/bin/bash
a=100
while [ $a -le 104 ]
do
hostip=192.168.10.$a
ping -c 2 -i 0.5 -w 2 $hostip &> /dev/null
if [ $? -eq 0 ];then
echo "$hostip 在线" >> /root/host_ip
fi
let a++
done
cat /root/host_ip
例4:
用户输入密码,脚本判断密码是否正确,正确密码为123456,输入正确提示正确信息,连续输错3次则报警
#!/bin/bash
i=0
while [ $i -le 2 ]
do
read -p "输入密码:" password
if [ $password == 123456 ];then
echo "密码正确"
exit 0
else
echo "密码错误"
fi
let i++
done
echo "超过三次"
例5:
把0~255的十进制整数转换成8位二进制数
#!/bin/bash
#把0~255的十进制整数转换成8位二进制数
read -p "请输入一个0~255的整数:" num
for i in 128 64 32 16 8 4 2 1
do
NUM=$[num - i]
if [ $NUM -lt 0 ];then
echo -n 0
else
echo -n 1
num=$[num - i]
fi
done
echo ""
例6:
用while循环将一个200行的文件分割成多个50行的文件
#!/bin/bash
#用while循环将一个200行的文件分割成多个50行的文件
filepath=/root/day10/test.txt
#定义行数计数器变量
a=0
#定义文件序号变量
i=1
cat $filepath | while read line
do
let a++
#判断是否已经读入50行,满50行则文件序号+1
c=$[a % 50]
if [ $c -eq 0 ];then
echo $line >> /root/day10/test${i}.txt
let i++
else
echo $line >> /root/day10/test${i}.txt
fi
done
三、until循环
注:条件不符合就会一直循环,直到条件符合后才会退出循环
until 条件测试操作
do
命令序列
done
例题:
打印数字1-10
[root@localhost xunhuan]#until [ $i -gt 10 ]
> do
> echo $i
> let i++
> done