Shell循环结构

Shell循环结构

Shell有多种循环形式,包括while循环、until循环、for循环和select in循环。

while循环

while 循环是Shell中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环。

格式

while condition
do
    statements
done

condition表示判断条件,statements表示要执行的语句,dodone都是 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=(mn)!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

until循环

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循环

流程图

初始化
判断
基本操作
结束
自增/自减

基本格式

for((exp1; exp2; exp3))
do
    statements
done

exp1、exp2、exp3 是三个表达式,其中 exp2 是判断条件,for 循环根据 exp2 结果来决定是否继续下一次循环

实例1

实现一个简单的累加功能

#!/bin/bash

sum=0
for ((i=0; i<=20; i++))
do
    ((sum += i))
done
echo "累加和为:$sum"

输出结果

累加和为:210

for in格式

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循环

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"

输出结果

Shell循环结构_第1张图片

break和continue

如果想要提前结束循环,可以使用break和continue。像C、Java、php等都带有这个功能,几乎学习计算机的没有几个人不知道这两个关键字的作用的,这里简单描述一下。

break 详解

Shell中break与我们前面学过的语言还是有些不同的,可以指定跳出循环的层数,而像常规语言正常都是一层一层跳出循环。

格式:

break n

n表示跳出循环的层数,若省略n时是跳出当前循环。且break一般与if条件一起使用,当达到某个条件时跳出循环。

continue详解

同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

你可能感兴趣的:(linux,shell,shell脚本)