一、for循环
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重。
for循环语句
一、for循环
1、语法结构
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
遍历格式
for 变量名 in {list}
do
command
done
例子1
// { } 里面不识别变量
for i in {a..c}
do
echo $i
done
例子2
//seq 5=1、2、3、4、5序列
for i in `seq 5`
do
echo $i
done
例子3
//seq可以引用变量
a=10
for i in `seq $a`
do
echo $i
done
for 变量名 in a b c
do
command
done
例子1
//i这里实际没有调用,所以就相当于in后面几个参数就循环几次
for i in a b c
do
echo 123
done
例子2
//这里调用到i变量了,所以就正常显示i的值(a\b\c)
for i in a b c
do
echo $i
done
1.1、案例
1.1.1、例1:打印1-5这5个数字
#!/bin/bash
read -p "第一种方法1 ,第二种方法2" a
case $a in
1)
echo "这是第一种方法"
for i in {1..5}
do
echo $i
done
;;
2)
echo "这是第二种方法"
for i in `seq 5`
do
echo $i
done
;;
*)
echo "这是第二种方法"
for i in 1 2 3 4 5
do
echo $i
done
;;
esac
1.1.2、例2打印5次hello world
注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数
#!/bin/bash
for i in {1..5}
do
echo "hello world"
done
1.1.3、例3:打印abcde
#!/bin/bash
for i in {a..e}
do
echo $i
done
1.1.4、例4:输出0-50之间的偶数
#!/bin/bash
for i in {0..50..2}
do
echo $i
done
附1
小技巧:花括号{}和seq在for循环的应用:
- for i in {1..50..2} 1-50的奇数
- for i in {2..50..2} 1-50的偶数
- for i in {10..1} 1-10倒序排列
- for i in $(seq 10) 1-10正序排列
- for i in $(seq 10 -1 1) 1-10倒序排列
- for i in $(seq 1 2 10) 1-10的奇数,中间为步长
- for i in $(seq 0 2 10) 1-10的偶数,中间为步长
#!/bin/bash
for i in $(seq 0 5 10)
do
echo $i
done
1.1.5、不带列表循环执行时由用户指定参数和参数的个数决定的
格式
for 变量名
do
command
done
1.1.5.1、 例1:打印hello
把2、4赋值给变量i,i有值了它就开始执行do..done了
#!/bin/bash
for i
do
echo $i "hello"
done
1.1.6、类C风格的for循环
格式
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
1.1.6.1、打印1-5
#!/bin/bash
for ((i=1;i<=5;i++))
do
echo $i
done
注:i++ : i=1+1 先赋值再运算 i=1 之后 再 +1
++i : 1+1=i 先运算再赋值 1+1 之后 再 =i
1.1.6.2、例2:打印1-10的奇数
#!/bin/bash
for ((i=1;i<=10;i+=2))
do
echo $i
done
附2:
类C风格运算符用法
++ 自身变量+1
-- 自身变量-1
+=5 自身变量+5
-=5 自身变量-5
*=5 自身变量*5
/=5 自身变量/5
%=5 自身变量%5
1.1.6.3、例3:计算1-100的奇数和
#!/bin/bash
sum=0
for ((i=1;i<=100;i+=2))
do
let sum=$i+$sum
done
echo "1-100奇数 $sum"
1.1.6.4、例1、批量添加用户两种方式
1、以后缀批量变化添加
#!/bin/bash
for i in {1..5}
do
useradd stu$i
echo "123" | passwd -stdin stu$i
done
2、脚本批量添加用户
zhang
wang
li
zhao
#!/bin/bash
USER=$(cat /opt/user.txt )
for name in $USER
do
useradd $name
echo "123" | passwd --stdin $name &>/dev/null
done
3、批量删除用户的脚本
1.1.6.5、例2、根据 IP 地址列表检查主机状态
-c 发送包的数量;-i 发送 ping 包间隔;-W 超时时间
1、根据文本查看
192.168.88.19
192.168.99.11
#!/bin/bash
LIST=$(cat /opt/pinghost.txt )
for ip in $LIST
do
ping -c 3 -i 0.2 -w 1 $ip &>/dev/null
if [ $? = 0 ];then
echo "可以ping通"
else
echo "不可以ping通"
fi
done
2、根据段查看
#!/bin/bash
NETWORK=$1
for ip in {1..255}
do
ping -c 3 -i 0.2 -w 1 $NETWORK.$ip &>/dev/null
if [ $? = 0 ];then
echo "可以ping通"
else
echo "不可以ping通"
fi
done
1.1.6.6、用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
#!/bin/bash
PASSWD=123456
for ((i=1;i<=3;i++))
do
read -p "请输入密码" passwd
if [[ $passwd == $PASSWD ]];then
echo "正确"
exit
else
echo "密码错误"
fi
done
echo "操作过多"
1.1.6.7、幸运会员
二、while语句的结构
while循环
1、语法结构
2、死循环
(1)语法结构(3种)
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
语法结构
while 表达式
do
command
done
2.1、例1:打印1-5
#!/bin/bash
i=0
while [[ $i -le 5 ]]
do
echo $i
let i++
done
2.2、输出1-100之间不能被3整除的数字
#!/bin/bash
i=0
while [[ $i -le 100 ]]
do
if [[ $i%3 -eq 0 ]];then
let i++
else
echo $i
let i++
fi
done
2.3、打印1-100的和
#!/bin/bash
i=0
sum=0
while [[ $i -le 100 ]]
do
let sum=$[sum+i]
let i++
done
echo $sum
注意:let sum=$[sum+i] “=” 不能分开
2.4、监控某服务(httpd)运行状态
2.5、while死循环
写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
格式
while [ 1 -eq 1 ]
do
command
done
while true
do
command
done
while :
do
command
done