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中的输入和输出。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容