Shell有多种循环形式,包括while循环、until循环、for循环和select in循环。
while 循环是Shell中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。
while condition
do
statements
done
condition
表示判断条件,statements
表示要执行的语句,do
和done
都是 Shell 中的关键字。
接下来实现一个高中时候全排列计算个数的功能,实现公式如下:
A m n = m ! n ! A_m^n=\frac{m!}{n!} Amn=n!m!
C m n = m ! ( m − n ) ! n ! C_m^n=\frac{m!}{(m-n)!n!} Cmn=(m−n)!n!m!
#!/bin/bash
printf "请输入m的值:"
read m
printf "请输入n的只:"
read n
j=1;
k=1;
Mm=1;
Nn=1;
if (($m >= $n))
then
s=$((m-n))
while ((j <= m))
do
((Mm *= j))
((j++))
done
while ((k <= n))
do
((Nn *= k))
((k++))
done
num=$((Mm/Nn))
echo "$m中取$n个元素的全排列数为:$num"
else
echo "$m取值小于$n"
fi
请输入m的值:5
请输入n的只:2
5中取2个元素的全排列数为:60
unti 循环和 while 循环恰好相反,当判断条件不成立时才进行循环,一旦判断条件成立,就终止循环。
until condition
do
statements
done
condition
表示判断条件,statements
表示要执行的语句
上面while中进行了全排列,这里就做个简单的累加
#/bin/bash
printf "请输入开始值:"
read m
printf "请输入结束值:"
read n
sum=0
if (($m > $n))
then
((temp=m))
((m=n))
((n=temp))
fi
((temp=m))
until ((m > n))
do
((sum+=m))
((m++))
done
echo "$temp到$n累加和sum为:$sum"
sh until.sh
请输入开始值:2
请输入结束值:5
2到5累加和sum为14
for((exp1; exp2; exp3))
do
statements
done
exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 结果来决定是否继续下一次循环
实现一个简单的累加功能
#!/bin/bash
sum=0
for ((i=0; i<=20; i++))
do
((sum += i))
done
echo "累加和为:$sum"
累加和为:210
for var in varList
do
statements
done
in varList 部分可以省略,省略后的效果相当于 in $@
varList的形式有很多,可以直接给出具体值,也可以给出一个范围,也可以是上一轮操作获得的列表变量,或者是Shell通配符
直接给出
使用空格分隔
比如:1 2 3 4 5
,"Alice" "Bob" "Franch" "John"
给出一个取值范围
[start…end]
比如:[1..5]
,[A..Z]
,[A..z]
Shell是根据ASCII码进行输出的,即输出[A..z]
时会把A-z的所有字符依次输出。
上一轮结果
比如$(ls *.sh)
,$(seq 1 100)
#!/bin/bash
value=$(seq 3 3 100)
for i in $value
do
echo $i
done
seq的使用清参考博客Shell脚本之seq,上面主要实现的是输出以3为倍数的所有3-100之间的数字
通配符获取列表
#!/bin/bash
for f in *.sh
do
echo $f
done
以上会输出当前目录所有以sh为后缀的文件名
select in循环是Shell独有的一种循环方式,用来增强交互性,可以通过列表中的编号来获取到每一个值
语法和for in的几近一样
select var in valueList
do
statements
done
#!/bin/bash
echo "请输入你的选择,请慎重:"
select i in "A" "B" "C" "D"
do
echo $i
done
echo "你最终选择了$i"
如果想要提前结束循环,可以使用break和continue。像C、Java、php等都带有这个功能,几乎学习计算机的没有几个人不知道这两个关键字的作用的,这里简单描述一下。
Shell中break与我们前面学过的语言还是有些不同的,可以指定跳出循环的层数,而像常规语言正常都是一层一层跳出循环。
格式:
break n
n表示跳出循环的层数,若省略n时是跳出当前循环。且break一般与if条件一起使用,当达到某个条件时跳出循环。
同break一样,continue也同样可以指定跳过循环的层数
格式:
continue n
n 表示循环的层数,若省略n时只对当前循环语句有效,遇到continue跳过本次循环,若n为省略时会跳过对应层数的循环
写了个简单的例子验证上面的效果
#!/bin/bash
for((i=1; i<=5; i++)); do
for((j=6; j<=10; j++)); do
for((k=11; k<=15; k++)); do
if ((k==12)); then
continue 3
fi
echo "$i -- $j -- $k"
done
echo "$i -- $j"
done
echo "$i =="
done