shell 循环与结构化命令

for循环

列表for循环

for variable in {list}

do

command 

command

done

 

dodone之间的命令称为循环体

执行次数和list列表中常数或字符串的个数相同

 

当执行for循环时,首先将in后的list列表的第一个常数或字符串赋值给循环变量,然后执行循环体;接着将list列表中的第二个常数或字符串赋值给循环变量,再次执行循环体,这个过程将一直持续到list列表中无其他的常数或字符串,然后执行done命令后的命令序列。

 

#!/bin/bash

for varible1 in 1 2 3 4 5

do

     echo "Hello, Welcome $varible1 times "

done

 

#!/bin/bash

for file in $( ls )

do

   echo "file: $file"

done

不带列表for循环

不带列表的for循环执行时由用户指定参数和参数的个数

 

for variable

do

command 

command

done

 

其中dodone之间的命令称为循环体,Shell会自动的将命令行键入的所有参数依次组织成列表,每次将一个命令行键入的参数显示给用户,直至所有的命令行中的参数都显示给用户

 

#!/bin/bash

echo "number of arguments is $#"

echo "What you input is: "

for argument

do

    echo "$argument"

done

 

运行 ./for_test.sh 1 2 3

C风格的for循环

C风格的for循环也可被称为计次循环,一般用于循环次数已知的情况

 

for(( expr1; expr2; expr3 ))

do

command

command

done

 

其中表达式expr1为循环变量赋初值的语句

表达式expr2决定是否进行循环的表达式,

当判断expr2退出状态为0执行dodone之间的循环体,

当退出状态为非0时将退出for循环执行done后的命令

表达式expr3用于改变循环变量的语句

 

C风格的for循环结构中,循环体也是一个块语句,要么是单条命令,要么是多条命令,但必须包裹在dodone之间。

 

#!/bin/bash

for(( integer = 1; integer <= 5; integer++ ))

do

    echo "$integer"

done

 

 

#!/bin/bash

sum=0

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

do

let "sum += i"

done

echo "sum=$sum"

 

let 执行运算

 

 

#!/bin/bash

sum=0

for i in {1..100..2}

do

    let "sum+=i"

done 

echo "sum=$sum"

 

等价于for(( i=1;i<=100;i+=2 ))

 

 

#!/bin/bash

sum=0

for i in $(seq 1 2 100)

do

let "sum+=i"

done

echo "sum=$sum"

 

[root@ktz CH08]# seq 1 10

1

2

3

4

5

6

7

8

9

10

 

$(seq 1 2 100)

等同于 `seq 1 2 100`

 

#!/bin/bash

 

LIMIT=5

 

for(( a=1, b=5; a <= LIMIT; a++, b-- ))

do

    let "temp=a-b"

    echo "$a-$b=$temp"

done

 

 

while循环

while循环语句也称前测试循环语句

它的循环重复执行次数,是利用一个条件来控制是否继续重复执行这个语句。

while语句与for循环语句相比,无论是语法还是执行的流程,都比较简明易懂

 

while expression

do

     command

     command

     …

done

 

while循环语句之所以命名为前测试循环,是因为它要先判断此循环的条件是否成立,然后才作重复执行的操作。

 

while循环语句执行过程是:

先判断expression的退出状态,如果退出状态为0,则执行循环体,并且在执行完循环体后,进行下一次循环,

否则退出循环执行done后的命令。

 

为了避免死循环,必须保证在循环体中包含循环出口条件,即存在expression的退出状态为非0的情况

 

 

计数器控制的while循环

假定该种情形是在已经准确知道要输入的数据或字符串的数目,在这种情况下可采用计数器控制的while循环结构来处理。

 

counter = 1

while expression

do

command

let command to operate counter

command

Done

 

#!/bin/bash

int=1

while(( "$int" <= 5 ))

do

    echo "$int"

    let "int++"

done

 

#!/bin/bash

sum=0

i=1

while(( i <= 100 ))

do

    let "sum+=i"

    let "i += 2"   

done

echo "sum=$sum"

 

结束标记控制的while循环

Linux Shell编程中很多时候不知道读入数据的个数,但是可以设置一个特殊的数据值来结束while循环,该特殊数据值称为结束标记,其通过提示用户输入特殊字符或数字来操作。当用户输入该标记后结束while循环,执行done后的命令。

 

read variable

while [[ "$variable" = sentinel ]]

do

     read variable

done

 

标志控制的while循环

标志控制的while循环使用用户输入的标志的值来控制循环的结束,这样避免了用户不知到循环结束标记的麻烦

 

signal=0

while (( signal != 1 ))

do

if expression

then

signal=1

fi

done

 

命令行控制的while循环

有时需要使用命令行来指定输出参数和参数个数,这时用其他的三种形式的while循环是无法实现的,所以需要使用命令行控制的while循环。该形式下,while循环通常与shift结合起来使用。

 

shift命令

使位置变量下移一位(即$2代替$1$3代替$2),

并且使$#变量递减,当最后一个参数也显示给用户后,$#就会等于0,同时$*也等于空

 

while [[ "$*" != "" ]]

do

echo "$1"

shift

done

 

until循环

在执行while循环时,只要是expression的退出状态为0将一直执行循环体。

 

until命令和while命令类似,但区别是until循环中expression的退出状态不为0将循环体一直执行下去,直到退出状态为0

 

until expression

do 

command

    command

    …

done

 

#until_exam1.sh

#!/bin/bash

i=0

until [[ "$i" -gt 5 ]]

do

    let "square=i*i"

    echo "$i * $i = $square"

    let "i++"

done

 

嵌套循环

一个循环体内又包含另一个完整的循环结构,称为循环的嵌套。在外部循环的每次执行过程中都会触发内部循环,直至内部完成一次循环,才接着执行下一次的外部循环。for循环、while循环和until循环可以相互嵌套。

 

break循环控制符

break语句可以应用在forwhileuntil循环语句中,用于强行退出循环,也就是忽略循环体中任何其他语句和循环条件的限制。

 

continue循环控制符

continue循环控制符应用在forwhileuntil语句中,用于让脚本跳过其后面的语句,执行下一次循环

 

select结构

selectbash的扩展结构,用于交互式菜单显示,用于从一组不同的值中进行选择,功能有点类似于case结构,但其交互性要比case好的多,其基本结构为:

 

select variable in {list} 

do

command

break

done

 

#select_exam1.sh

#!/bin/bash

echo "What is your favourite color? "

select color in "red" "blue" "green" "white" "black"

do 

    break

done

echo "You have selected $color"

执行结果

[root@ktz CH08]# ./select_exam1.sh 

What is your favourite color? 

1) red

2) blue

3) green

4) white

5) black

#? 1

You have selected red

[root@ktz CH08]# 

 

转载于:https://my.oschina.net/dataRunner/blog/359803

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值