shell for循环总结

1 shell for循环语法

for 变量 in 列表

do

    command1

    command2

    ...

    commandN

done

1.1 读取列表中的值

#!/bin/bash

for test in apple boy cat dog

do

  echo The next state is $test

done

结果:

The next state is apple

The next state is boy

The next state is cat

The next state is dog

1.2 读取列表中的复杂值

有两种解决办法:

#使用转义字符(反斜线)来将单引号转移;

#使用双引号来定义用到单引号的值。

#!/bin/bash

for test in I don\'t think if "this'll" work

do

  echo The next state is $test

done

结果是:

The next state is I

The next state is don't

The next state is think

The next state is if

The next state is this'll

The next state is work

*记住,for命令用空格来划分列表中的每个值。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。

1.3 从变量读取列表

将一系列的值都集中存储在一个变量中,然后需要遍历变量中的整个列表。

#!/bin/bash

list="helllo world"

#向已有列表中添加或拼接一个值

list=$list" ok"

for state in $list

do

  echo "this word  is $state"

done

结果是:

this word is helllo

this word  is world

this word  is ok

1.4 从命令读取值

有两种方式可以将命令输出赋值给变量: 

(1)反引号字符(``) 

(2)$()格式

如:

for i in $(who)

do

  echo "visit beautiful $i"

done

输出结果:

visit beautiful etldev

visit beautiful pts/0

visit beautiful 2019-05-15

visit beautiful 09:31

visit beautiful (112.64.161.227)

visit beautiful root

visit beautiful pts/1

visit beautiful 2019-05-09

visit beautiful 07:41

visit beautiful (10.1.1.62)

visit beautiful etldev

visit beautiful pts/3

visit beautiful 2019-05-15

visit beautiful 09:34

visit beautiful (112.64.161.227)

visit beautiful etldev

visit beautiful pts/4

visit beautiful 2019-05-15

visit beautiful 10:49

visit beautiful (112.64.161.227)

*who默认输出当前登录的所有用户的信息如下所示

etldev pts/0        2019-05-15 09:31 (112.64.161.227)

root    pts/1        2019-05-09 07:41 (10.1.1.62)

etldev  pts/3        2019-05-15 09:34 (112.64.161.227)

etldev  pts/4        2019-05-15 10:49 (112.64.161.227)

1.5 更改字段分隔符

造成这个问题的原因是特殊的环境变量IFS,叫作内部字段分隔符。默认情况下,bash shell会将下列字符当作字段分隔符:

*空格

*制表符

*换行符

如果bash shell在数据中看到这些字符中的任意一个,它就会假定这表明了列表中一个新数据字段的开始。

想修改IFS的值,使其只能识别换行符,那就必须:

IFS=$'\n'

将这个语句加入到脚本中,告诉bash shell在数据值中忽略空格和制表符。

一个可参考的安全实践是在改变IFS之前保存原来的IFS值,之后再恢复它。

实现:

IFS.OLD=$IFS

IFS=$'\n'

<在代码中使用新的IFS值>

IFS=$IFS.OLD

这就保证了在脚本的后续操作中使用的是IFS的默认值。

遍历一个文件中用冒号分隔的值:

IFS=:

如果要指定多个IFS字符,只要将它们在赋值行串起来就行。

IFS=$'\n':;"

这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。如何使用IFS字符解析数据没有任何限制。

1.6 用通配符读取目录

for file in /proc/*; 

do 

echo $file is file path \! ; 

done

2 类C风格for循环的语法格式

for((expr1; expr2; expr3))

do 

    command 

    command 

    ... 

done

有些部分并没有遵循bash shell标准的for命令: 

*变量赋值可以有空格 

*条件中的变量不以美元符开头 

*迭代过程的算式为用expr命令格式

#!/bin/bash

#使用类C风格for循环输出1~5

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

 do

   echo "$integer"  

done 

结果:

1

2

3

4

5

使用类C风格for循环要注意以下事项:

a.如果循环条件最初的退出状态为非0,则不会执行循环体

b.当执行更新语句时,如果循环条件的退出状态永远为0,则for循环将永远执行下去,从而产生死循环

c.Linux shell中不运行使用非整数类型的数作为循环变量

d.如果循环体中的循环条件被忽略,则默认的退出状态为0

e.在类C风格的for循环中,可以将三个语句全部忽略掉,下面是合法的for循环

for((; ; )) 

do 

    echo "hello world" 

done

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

推荐阅读更多精彩内容