For 循环
语法1
语法1
for 变量 in 值1 值2 值3 …(可以是一个文件等)
do
程序
done
这种语法中for循环的次数,取决于in后面值的个数(空格分隔),可以看出遍历列表
有几个值就循环几次,并且每次循环都把值赋予变量。
假设in后面有三个值,for会循环三次,第一次循环会把值1赋予变量,第二次循环会把值2赋予变量,以此类推。
测试
for var in 1 2 3 4 5
do
echo $var
done
[root@VM-12-14-centos ~]# ./test5.sh
1
2
3
4
5
拷贝所有sh文件到某个目录
#创建一个log文件
touch sh.log
#把所有.sh结尾的文件的文件覆盖到sh.log 临时文件中
ls *.sh > sh.log
#读取ls.log文件的内容,文件中有多少个值,就会循环多少次,每次循环把文件名赋予变量i
for i in $(cat sh.log)
do
#批量拷贝到$1目录
cp -r $i $1
done
#删除临时文件sh.log
rm -rf sh.log
运行结果
[root@VM-12-14-centos ~]# ll sh
total 0
[root@VM-12-14-centos ~]# vim test6.sh
[root@VM-12-14-centos ~]# ./test6.sh sh
[root@VM-12-14-centos ~]# ll sh
total 96
-rw-r--r-- 1 root root 773 Oct 10 19:15 centos7.sh
语法2
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
语法2中需要注意:
初始值:在循环开始时,需要给某个变量赋予初始值,如i=1;
循环控制条件:用于指定变量循环的次数,如i<=100,则只要i的值小于等于100,循环就会继续;
变量变化:每次循环之后,变量该如何变化,如i=i+1。代表每次循环之后,变量i的值都加1。
测试
简单的累加器
#求两个数中间的值相加的和(包含者两个数)
sum=0
if $1 -lt $2
then
for (( i=$1;i<=$2;i=i+1 ))
do
#每次循环给变量sum赋值
sum=$(( $sum+$i ))
done
#输出$1加到$2的和
echo "$sum"
else
for (( i=$2;i<=$1;i=i+1 ))
do
#每次循环给变量sum赋值
sum=$(( $sum+$i ))
done
#输出$2加到$1的和
echo "$sum"
fi
[root@VM-12-14-centos ~]# vim test7.sh
[root@VM-12-14-centos ~]# ./test7.sh 1 2
3
[root@VM-12-14-centos ~]# ./test7.sh 1 9
45
[root@VM-12-14-centos ~]# ./test7.sh 5 1
15
while循环
对while循环来讲,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。
while [ 条件判断式 ]
do
程序
done
测试
输出这个数到10的所有数(包括它本身)
s=$1
while [ $s -gt 10 ]
do
echo $s
s=$(( $s+1 ))
done
[root@VM-12-14-centos ~]# ./test8.sh 2
2
3
4
5
6
7
8
9
[root@VM-12-14-centos ~]# ./test8.sh 5
5
6
7
8
9
一个简单的猜数字小游戏
rund=$(expr $RANDOM % 1000)
times=0
echo "商品的价格为0-999之间"
while true
do
read -p "输入价格:" sum
let times++
if [ $sum -eq $rund ] ;
then
echo "猜对了,实际价格是 $rund"
echo "总共猜了 $times 次"
exit 0
elif [ $sum -gt $rund ] ;
then
echo "太高了"
else
echo "太低了"
fi
done
[root@VM-12-14-centos ~]# ./test9.sh
商品的价格为0-999之间
输入价格:500
太低了
输入价格:750
太低了
输入价格:850
太低了
输入价格:950
太高了
输入价格:900
太低了
输入价格:925
太高了
输入价格:920
太低了
输入价格:922
猜对了,实际价格是 922
总共猜了 8 次
until循环
和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。
语法:
until [ 条件判断式 ]
do
程序
done
测试
i=1
sum=0
#当变量i的值大于100,停止循环
until [ $i -gt 100 ]
do
s=$(( $s+$i ))
i=$(( $i+1 ))
done
echo "$s"
[root@VM-12-14-centos ~]# ./test10.sh
5050
函数
function 函数名 () {
程序
}
测试
#接收用户输入的数字,然后从1加到这个数字
function sum () {
s=0
for (( i=0; i<=$num;i=i+1 ))
do
s=$(( $i+$s ))
done
echo "$s"
}
read -p "Please input a number: " -t 30 num
[root@VM-12-14-centos ~]# ./test11.sh
Please input a number: 5
15