9.Scripts

本章同步视频:https://edu.51cto.com/sd/e4874

9.5 循环 (loop)

9.5.1 while do done

1.格式与说明

while condition

do

    statements

done

       condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。

       while 循环的执行流程为:

u  先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环。

u  每一次执行到 done 的时候都会重新判断 condition 是否成立,如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句,如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码。

u  如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

注意:要避免死循环。

2.案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

i=1

sum=0

while ((i <= 100))

do

    ((sum += i))

    ((i++))

done

echo "The sum is: $sum"

[root@localhost tmp]# sh 1.sh

The sum is: 5050

9.5.2  until do done

1.格式与说明

until condition

do

    statements

done

       condition表示判断条件,statements表示要执行的语句(可以只有一条,也可以有多条),do和done都是 Shell 中的关键字。

       until 循环的执行流程为:

u  先对 condition 进行判断,如果该条件不成立,就进入循环,执行 until 循环体中的语句(do 和 done 之间的语句),这样就完成了一次循环。

u  每一次执行到 done 的时候都会重新判断 condition 是否成立,如果不成立,就进入下一次循环,继续执行循环体中的语句,如果成立,就结束整个 until 循环,执行 done 后面的其它 Shell 代码。

u  如果一开始 condition 就成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

注意:要避免死循环。

2.案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

i=1

sum=0

until ((i > 100))

do

    ((sum += i))

    ((i++))

done

echo "The sum is: $sum"

[root@localhost tmp]# sh 1.sh

The sum is: 5050

9.5.3 for...do...done

1.格式1——列出所有取值

(1)格式与说明

for variable in value_list

do

    statements

done

       variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。

        in value_list 部分可以省略,省略后的效果相当于 in $@。

        每次循环都会从 value_list 中取出一个值赋给变量 variable,然后进入循环体(do 和 done 之间的部分),执行循环体中的 statements。直到取完 value_list 中的所有值,循环就结束了。

(2)案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

sum=0

for n in 1 2 3 4 5 6

do

     sum=$(($sum+$n))

done

echo "The sum is "$sum

[root@localhost tmp]# sh 1.sh

The sum is 21

2.格式2——给出一个取值范围

(1)格式与说明

for variable in {start..end}

do

    statements

done

       start 表示起始值,end 表示终止值;注意中间用两个点号相连,而不是三个点号。根据实测,这种形式只支持数字和字母。

(2)案例1

#!/bin/bash

sum=0

for n in {1..100}

do

    ((sum+=n))

done

echo $sum

(3)案例2

[dmtsai@study bin]$ vim pingip.sh

#!/bin/bash

network="192.168.1"              # 先定义一个网域的前面部分!

for sitenu in $(seq 1 100)       # seq 为 sequence(连续) 的缩写之意

do

# 底下的程序在取得 ping 的回传值是正确的还是失败的!

        ping -c 1 -w 1 ${network}.${sitenu} &> /dev/null && result=0 || result=1

# 开始显示结果是正确的启动 (UP) 还是错误的没有连通 (DOWN)

        if [ "${result}" == 0 ]; then

                echo "Server ${network}.${sitenu} is UP."

        else

                echo "Server ${network}.${sitenu} is DOWN."

        fi

done

(4)案例3

#!/bin/bash

sum=0

for n in $(seq 2 2 100)    

do

    ((sum+=n))

done

echo $sum

#seq 是一个 Linux 命令,用来产生某个范围内的整数,并且可以设置步长。

#seq 2 2 100表示从 2 开始,每次增加 2,到 100 结束。

3.格式3——特殊案例

(1)案例1——使用通配符

#!/bin/bash

for filename in *.sh

do

    echo $filename

done

(2)案例2——使用特殊变量

#!/bin/bash

for str in $@        #对参数进行循环

do

    echo $str

done

注:下面代码效果一样:

#!/bin/bash

for str          #没有in,表示直接获取参数进行循环

do

    echo $str

done

(3)案例3——使用命令结果

#!/bin/bash

for username in `cut -d ":" -f1 /etc/passwd | head -n 5`

do

        id ${username}

done

9.5.4 for...do...done 的数值处理

1.格式和说明

for((exp1; exp2; exp3))

do

    statements

done

说明:

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

u  statements 是循环体语句,可以有一条,也可以有多条;

u  do 和 done 是 Shell 中的关键字。

它的运行过程为:

1) 先执行 exp1。

2) 再执行 exp2,如果它的判断结果是成立的,则执行循环体中的语句,否则结束整个 for 循环。

3) 执行完循环体后再执行 exp3。

4) 重复执行步骤 2) 和 3),直到 exp2 的判断结果不成立,就结束循环。

u  exp1 仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句。

u  exp2 一般是一个关系表达式,决定了是否还要继续下次循环,称为“循环条件”。

u  exp3 很多情况下是一个带有自增或自减运算的表达式,以使循环条件逐渐变得“不成立”。

                              Linux-scripts-循环_第1张图片spacer.gif

2.案例

#!/bin/bash

sum=0

for ((i=1; i<=100; i++))

do

    ((sum += i))

done

echo "The sum is: $sum"

9.5.5 select in 循环

       select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景。

1.格式和说明

select variable in value_list

do

    statements

done

       variable 表示变量,value_list 表示取值列表,in 是 Shell 中的关键字。

2.案例

[root@localhost tmp]# vim 1.sh

#!/bin/bash

echo "What is your favourite OS?"

select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"

do

    echo $name

done

echo "You have selected $name"

[root@localhost tmp]# sh 1.sh

What is your favourite OS?

1) Linux

2) Windows

3) Mac OS

4) UNIX

5) Android

#? 2

Windows

#? 4

UNIX

#? 9

 

#? ^D

注:#?用来提示用户输入菜单编号;^D表示按下 Ctrl+D 组合键,它的作用是结束 select in 循环。

注:select 是无限循环(死循环),输入空值,或者输入的值无效,都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D 组合键才能结束循环。

3.select in 通常和 case in 一起使用

#!/bin/bash

echo "What is your favourite OS?"

select name in "Linux" "Windows" "Mac OS" "UNIX" "Android"

do

    case $name in

        "Linux")

            echo "Linux是一个类UNIX操作系统,它开源免费,运行在各种服务器设备和嵌入式设备。"

            break

            ;;

        "Windows")

            echo "Windows是微软开发的个人电脑操作系统,它是闭源收费的。"

            break

            ;;

        "Mac OS")

            echo "Mac OS是苹果公司基于UNIX开发的一款图形界面操作系统,只能运行与苹果提供的硬件之上。"

            break

            ;;

        "UNIX")

            echo "UNIX是操作系统的开山鼻祖,现在已经逐渐退出历史舞台,只应用在特殊场合。"

            break

            ;;

        "Android")

            echo "Android是由Google开发的手机操作系统,目前已经占据了70%的市场份额。"

            break

            ;;

        *)

            echo "输入错误,请重新输入"

    esac

done