for循环是固定循环,也就是在循环时就已经知道需要进行几次的循环,有事也把for循环成为计数循环。for的语法如下两种:
语法一
for 变量 in 值1 值2 值3 …(可以是一个文件等)
do
程序
done
这种语法中for循环的次数,取决于in后面值的个数(空格分隔),有几个值就循环几次,并且每次循环都把值赋予变量。
也就是说,假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。
语法二
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
语法二中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。
语法一举例
vim test1.sh
#!/bin/bash
#打印时间
for time in morning afternooon evening
do
echo "This time is $time"
done
##执行脚本
[root@tdm1 ~]# bash test1.sh
This time is morning
This time is afternooon
This time is evening
语法一举例:批量压缩脚本
[root@localhost ~]$ vim test2.sh
#!/bin/bash
#批量解压缩脚本
cd/lamp
#进入压缩包目录
ls *.tar.gz > ls.log
#把所有.tar.gz结尾的文件的文件覆盖到ls.log 临时文件中
for i in $(cat ls.log) `
#或者这样写for i in `cat ls.log`
#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
do
tar -zxf $i &>/dev/null
#加压缩,并把所有输出都丢弃
done
rm -rf /lamp/ls.log
#删除临时文件ls.log
语法二举例:从1加到100
vim test3.sh
#!/bin/bash
#从1加到100
s=0
for ((i=1;i<=100;i=i+1))
do
s=$(( $s+$i ))
done
echo "1+2+3+..+100总和为$s"
##执行脚本
[root@tdm1 ~]# bash test3.sh
1+2+3+..+100总和为5050
语法二举例:批量添加指定数量用户
vim test4.sh
#!/bin/bash
#输入用户名,保存变量
read -p "please input user name: " -t 30 name
#输入添加用户的数量,保存变量
read -p "please input the number of users " -t 30 num
#输入密码,保存变量
read -p "please input the password for users: " -t 30 pass
#判断三个变量不为空
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
#执行循环
then
for (( i=1; i<=$num; i=i+1 ))
do
#添加用户,用户名为$name$i,产生的输出到垃圾桶
useradd $name$i >>/dev/null 2>&1
#设置密码
echo $pass | passwd --stdin $name$i >>/dev/null 2>&1
done
else
#三个变量有一个为空,则退出
echo " wrong ! exit !"
fi
##执行脚本
[root@tdm1 ~]# bash test.sh
please input user name: test
please input the number of users 5
please input the password for users: 123456
[root@tdm1 ~]# cat /etc/passwd | grep test
test1:x:1000:1000::/home/test1:/bin/bash
test2:x:1001:1001::/home/test2:/bin/bash
test3:x:1002:1002::/home/test3:/bin/bash
语法二举例:批量删除用户
vim test5.sh
#!/bin/bash
#批量删除用户
#读取文件信息,awk切割出用户名
user=$( cat /etc/passwd | grep test | awk -F ":" '{print $1}' )
#循环,有多少用户,循环多少次
for i in $user
do
#删除用户
userdel -r $i
done
##执行脚本
[root@tdm1 ~]# bash test5.sh
[root@tdm1 ~]# cat /etc/passwd | grep test
[root@tdm1 ~]#
对while循环来讲,只要条件判断式成立,循环就一直会继续,直到条件判断式不成立,循环才会停止。
语法
while [ 条件判断式 ]
do
程序
done
案例:1加到100
vim test6.sh
#!/bin/bash
#从1加到100
#给变量赋值
i=1
s=0
#如果变量i的值小于100,则执行循环
while [ $i -le 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "This sum is $s"
##执行脚本
[root@tdm1 ~]# bash test6.sh
This sum is 5050
案例:输入的数值进行比较
vim test7.sh
#!/bin/bash
price=$(( $RANDOM % 10 ))
times=0
echo "商品的价格在0-10之间,猜猜是多少?"
while true
do
read -p "请输入您猜的价格: " num
let times++
if [ $num -eq $price ]
then
echo "您猜对了,价格是$price"
echo "您总共猜了$times次"
exit 0
elif [ $num -gt $price ]
then
echo "太高了!"
else
echo "太低了!"
fi
done
##执行脚本
[root@tdm1 ~]# bash test7.sh
商品的价格在0-10之间,猜猜是多少?
请输入您猜的价格: 5
太低了!
请输入您猜的价格: 7
太高了!
请输入您猜的价格: 6
您猜对了,价格是6
您总共猜了3次
和while循环相反,until循环是只要判断式成立则进行循环,一旦判断式成立,则终止循环。
语法:
until [ 条件判断式 ]
do
程序
done
案例:1加到100
vim test8.sh
#!/bin/bash
i=1
s=0
#循环直到i大于100,就停止循环
until [ $i -gt 100 ]
do
s=$(( $s + $i ))
i=$(( $i + 1))
done
echo "This sum is $s"
##执行脚本
[root@tdm1 ~]# bash test8.sh
This sum is 5050
语法:
function 函数名 () {
程序
}
案例:接受用户输入的数字,然后从1加到这个数字
vim test9.sh
!/bin/bash
#定义函数
sum() {
s=0
for (( i=0;i<=$num;i=i+1 ))
do
s=$(( $i + $s ))
done
echo "1+2+3+..+$num: $s"
}
#接收用户输入的数字,并把值赋予变量num
read -p "please input a number: " -t 30 num
#把变量num的值替换为空,并赋予变量y
y=$( echo $num | sed 's/[0-9]//g' )
#判断变量y是否为空,以确定变量num中是否为数字
if [ -z $y ]
then
#调用sum函数,并把变量num的值作为第一个参数传递给sum函数
sum $sum
else
#如果变量num 的值不是数字,则输出报错信息
echo "error,please input a number!"
fi
##执行脚本
[root@tdm1 ~]# bash test9.sh
please input a number: 10
1+2+3+..+10: 55