shell脚本学习3-循环语句

     上一节讲了分支语句,本节介绍shell中的循环语句。shell中循环语句主要是三种:一种是for语句,另一种是while语句,最后一种是until-do语句。

1. for语句

1.1 简单的for语句

利用for语句可以重复取出一个列表中的值,一次取一个,取完为止。建立脚本如下:

#/bin/bash

for item in Apple Boy Cake Dog Ege Fake;do

    echo $item

done

运行结果如下:

Apple

Boy

Cake

Dog

Ege

Fake

1)注意:在C++中,如果我们写:

for (int i = 0; i < 5 ;i++) {

        cout << i;

}

cout << i;

会编译出错,因为第二个cout << i时是访问不了i这个变量了,i的生命周期只存在于for循环里面。但是,shell脚本不一样,在for的外面仍然可以访问,比如上面这个脚本item在for结束后一直存着的都是Fake这个值。

2)注意: 当列表中存在单引号的时候,两个单引号之间的内容会被当成一个整体,比如有一个脚本如下:

#/bin/bash

for item in Timmy hasn't ate Lucy's cake;do

    echo $item

done

运行结果如下:

Timmy

hasnt ate Lucys

cake

这个与预期的结果不一样。解决的方法有两个,第一个是在单引号前面增加转移符号(\),第二种方法是使用双引号把包含单引号的整个单词框起来,当在一个单词的两边加上双引号时,双引号本身不会被当前单词的一部分。分别建立脚本如下:

增加转义的脚本:

#/bin/bash

for item in Timmy hasn\'t ate Lucy\'s cake;do

    echo $item

done

使用双引号的脚本:

#/bin/bash

for item in Timmy "hasn't" ate "Lucy's" cake;do

    echo $item

done

两个脚本的运行结果相同,都为:

Timmy

hasn't

ate

Lucy's

cake

3)注意:for默认根据空格来分割列表,所以如果列表中有不想被分割的空格,那么就用双引号包起来,举例如下:

#/bin/bash

for item in "Ji Gong" "Wu Lin Wai Zhuan";do

    echo $item

done

运行结果如下:

Ji Gong

Wu Lin Wai Zhuan

4) 注意: m默认情况下,字符串以空格,制表符和换行符作为分隔符。比如说,我们现在从文件中用for去读取字符串,举例如下,首先建立一个文件testfile,内容为:

wu lin wai zhuan

di xia jiao tong zhan

da ran fang

然后建立脚本,这次从testfile文件中去读数据,脚本如下:

#/bin/bash

for item in $(cat testfile);do

    echo $item

done

运行后结果如下:

wu

lin

wai

zhuan

di

xia

jiao

tong

zhan

da

ran

fang

这里把testfile中的换行和空格都当作分割符了,有时候我们需要自己指定分隔符。这个时候我们只要改变环境变量IFS的值就可以了,IFS是内部字段分隔符,比如只以换行符对testfile进行分割,建立脚本如下:

#/bin/bash

IFS_old=$IFS

IFS=$'\n'

for item in $(cat testfile);do

    echo $item

done

IFS=$IFS_old

运行结果如下:

wu lin wai zhuan

di xia jiao tong zhan

da ran fang

这里设置之前备份了一下IFS的值,用完之后又还原回来。

 1.2 for语句读取文件夹

用for语句循环读取一个文件夹中的每个文件和文件夹,举例如下:

#/bin/bash

for item in /home/script/* /bin/*;do

    echo "$item"

done

运行如下:

/home/script/1

/home/script/test

/home/script/test1.sh

/bin/bash

 1.3 shell中类似C语言的for语句

shell可以像C语言那样写for循环,举例如下:

#/bin/bash

for (( i = 1,j=3; i<=3 && j > 0; i++,j--));do

    echo "$i * $j = $[$i * $j]"

done

运行结果如下:

1 * 3 = 3

2 * 2 = 4

3 * 1 = 3

注意:这里的风格和C语言很像,只不过使用的是两个小括号。其中,变量取值不用加美元符号,并且赋初值的时候可以有空格,也可以不加空格,判断的时候也可以加空格或者不加空格。

2. while语句

while判断条件是否成立,若成立则进入while的分支,举例如下:

#/bin/bash

var1=1

var2=4

while [ $var1 -lt 3 ] && [ $var2 -gt 0 ];do

    echo "$var1 * $var2 = $[$var1 * $var2]"

    var1=$[$var1 + 1]

    var2=$[$var2 - 1]

done

运行结果为:

1 * 4 = 4

2 * 3 = 6

3. until-do语句

until语句的逻辑与while相反,while当条件判断成功时进入循环,until判断条件失败时进入,举例如下:

#/bin/bash

var=0

until [ $var -gt 3 ];do

    echo "var=$var"

    var=$[$var + 1]

done

运行结果如下:

var=0

var=1

var=2

var=3

4. 循环语句中使用break和continue

4.1 break语句

break语句用于跳出当前层的循环,举例如下:

#/bin/bash

for ((i=0; i<2;i++));do

    for ((j=0;j<5;j++));do

        echo "i=$i,j=$j"

        if [ $j -eq 2 ];then

            break

        fi       

    done

done

运行如下:

i=0,j=0

i=0,j=1

i=0,j=2chuli

i=1,j=0

i=1,j=1

i=1,j=2

注意:break只能跳出当前层的循环,上面这个例子有两层循环的嵌套,那么当内层的break执行的时候只能跳出内层。

如果想要跳出多层循环,可以使用break n,举例如下:

#/bin/bash

for ((i=0; i<2;i++));do

    for ((j=0;j<5;j++));do

        echo "i=$i,j=$j"

        if [ $j -eq 2 ];then

            break 2

        fi       

    done

done

运行结果如下:

i=0,j=0

i=0,j=1

i=0,j=2

zenmxie4.2 continue语句

continue语句用于终止本次循环,即本次循环中continue后面的代码不执行,进行下一次循环的入口判断,举例如下:

#/bin/bash

for ((i=0; i<5;i++ ))

do

    if [ $i -lt 3 ];then

        continue

    fi

    echo "i = $i"

done

运行结果如下:

i = 3

i = 4

cotinue语句和break一样,也可以用continue n

5. 总结与展望

5.1总结

3(1)如何写简单的for语句读取列表,列表中如有有单引号怎么处理;

  (2)  for中对列表分隔符的使用和替换;

  (3)  for语句读取文件夹,C++风格的shell for语句怎么写;

  (4)   while语句怎么写;

(5)until-do语句怎么写,until与while判断方式正好相反;

(6)循环语句中使用break和continue。

5.2 展望

下次更新将学习使用shell中的输入和输出。

你可能感兴趣的:(shell脚本学习3-循环语句)