shell脚本编程-循环(for、while、until)

for命令格式:
– list参数:迭代中要用的一系列值
– 每个迭代中,变量var会包含列表中的当前值
– do和done语句之间输入的命令可以是一条或多条标准的bash shell命令

1

2

3

4

for var in list

do

commands

done

读取列表中的值

  • for命令最基本的用法就是遍历for命令自身中定义的一系列值:

    • 在最后一次迭代后,$test变量的值会在shell脚本的剩余部分一直保持有效,除非修改它

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

$cat test

#!/bin/bash

for test in Alabama Alaska Arizona Arkansas California Colorado

do

echo The next state is $test

done

echo "The last state we visited was $test"

test=Connecticut

echo "Wait , now we‘re visiting was $test"

$./test

The next state is Alabama

The next state is Alaska

...

The last state we visited was Colorado

wait, now we‘re visiting Connecticut

读取列表中的复杂值

  • 对于单双引号问题的解决

    • 使用转义字符来将单引号转义
    • 使用双引号来定义用到单引号的值

1

2

3

4

5

6

7

8

9

10

11

$cat test

#!/bin/bash

for test in I don‘t know if "this‘ll" work

do

echo "word:$test"

done

$./test

word:I

word:don‘t

...

  • 对于空格的问题解决:for循环假定每个值都是用空格分割的

    • 解决方法:用双引号来将这些值圈起来,如”New York”

从变量读取列表

  • 将一些列的值都集中存储在了一个变量中,然后遍历整个列表

1

2

3

4

5

6

7

8

9

10

11

12

13

14

$cat test

#!/bin/bash

list=“Alabama Alaska Arizona Arkansas California Colorado”

list=$list" Connecticut"

for state in $list

do

echo "Have you ever visited $state?"

done

$./test

Have you ever visited Alabama?

...

Have you ever visited Connecticut?

$

从命令读取值

  • 生成列表中要用的值的另外一个途径就是使用命令的输出

    • 可以使用反引号来执行任何能产生输出的命令,然后在for命令中使用该命令的输出

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

$cat test

#!/bin/bash

file="states"

for state in `cat $file`

do

echo "Visit beautiful $state"

done

$cat states

Alabama

Alaska

...

$./test

Visit beautiful Alabama

Visit beautiful Alaska

...

更改字段分隔符

  • 默认情况下,bash shell会将下列字段当做字段分隔符

    • 空格
    • 制表符
    • 换行符
  • 可以在shell脚本中临时更改IFS环境变量的值来限制一下被bash shell当作字段分隔符的字符
    • 例如

      • 修改IFS值使其只能识别换行符:IFS=$’\n’
      • 遍历一个文件中以冒号分隔的值:IFS=:
      • 如果指定多个IFS字符,只要将它们在赋值行串起来就行:IFS=$’\n:;’” (将换行符、冒号、分号和双引号作为字段分隔符)
    • 常用的做法:在改变IFS值之前保存原来的IFS值,之后再回复它

1

2

3

4

IFS.OLD=$IFS

IFS=$‘\n‘

<use the new IFS value in code>

IFS=$IFS.OLD

用通配符读取目录

  • for命令可以来自动变里满是文件的目录,操作时,必须在文件名或路径名中使用通配符,它会强制shell使用文件扩展匹配

    • 文件扩张匹配:生成匹配指定的通配符的文件或路径名的过程

1

2

3

4

5

6

7

8

9

10

11

12

13

...

for file in /home/rich/test/*

do

if [ -d "$file" ]

then

echo "$file is a directory"

elif [ -f第12章:更多结构化命令

第6章:理解Linux文件权限.md "$file" ]

then

echo "$file is a file"

fi

done

...

  • Linux中,目录名和文件名中包含空格是合法的,要容纳这种值,应该将$file变量用双括号圈起来
  • 可以在for命令中通过列出一系列的目录通配符来将目录查找的方法和列表方法结合起来

1

2

3

4

5

6

7

8

9

10

11

12

13

...

for file in /home/rich/.b* /home/rich/badtest

do

if [ -d "$file" ]

then

echo "$file is a directory"

elif [ -f "$file" ]

then

echo "$file is a file"

else

echo "$file doesn‘t exist"

fi

done

C语言的for命令

  • bash中C语言风格的for循环的基本格式:for (( variable assignment : condition : iteration process ))

    • 例如:for (( a = 1; a < 10; a++ ))
    • 一些没有遵循标准的bash shell for命令
      • 给变量赋值可以有空格
      • 条件中的变量不以美元符开头
      • 迭代过程的算式未用expr命令格式

1

2

3

4

5

6

7

8

9

10

11

$cat test

#!/bin/bash

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

do

echo "The next number is $i"

done

$./test

The next number is 1

The next number is 2

...

使用多个变量

  • C语言风格的for命令允许为迭代使用多个变量

    • 循环会独立处理每个变量,允许为每个变量定义不同的迭代过程
    • 当有多个变量时,只能在for循环中定义一个条件

1

2

3

4

5

6

...

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

do

echo "$a - $b"

done

...

while命令的基本格式

  • 格式如下:

    • while命令中定义的test命令和if-then中定义是一样的格式
    • while命令的关键:指定的test命令的退出状态码必须随着循环中运行的命令改变,否则while会不停循环下去
    • 最常用的test命令用法是,用方括号来查看命令中用到的shell变量的值

1

2

3

4

5

6

7

8

9

10

11

12

13

14

while test command

do

other commands

done

//eg:

...

var1=10

while [ $var1 -gt 0 ]

do

echo $var1

var1=$[ $var1 - 1 ]

done

...

使用多个测试命令

  • while命令中允许在while语句行定义多个测试命令,只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环

until命令

  • until命令和while命令工作方式完全相反

    • until命令要求制定一个通常输出非零退出状态码的测试命令

      • 只有测试命令的退出状态码非零,bash shell才会指定循环中列出的那些命令
      • 一旦测试命令返回了退出状态码0,循环就结束了

1

2

3

4

until test commands

do

other commands

done

  • 与while命令类似,可以在until命令语句中有多个测试命令,最后一个命令的退出状态码决定bash shell是否执行定义好的其他命令

嵌套循环

  • 脚本允许使用嵌套循环

循环处理文件数据

  • 通常,必须遍历存储在文件中的数据,这需要结合两种技术

    • 使用嵌套循环
    • 修改IFS环境变量
      • 使用环境变量IFS,强制for命令将文件中的每行都当成单独一个条目,即便数据中有空格也是如此
      • 一旦从文件中提取除了单独的行,可能需要再次循环来提取其中的数据

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

$cat test

#!/bin/bash

IFS.OLD=$IFS

IFS=$‘\n‘

for entry in `cat /etc/passwd`

do

echo "values in $entry -"

IFS=:

for value in $entry

do

echo "    $value"

done

done

$./test

Value in rich:x:501:501:Rich Blum:/home/rich:/bin/bash -

rich

x

501

...

/bin/bash

Value in ...

控制循环

break命令

  • break命令:退出任意类型的循环,包括while和until循环
  • 指定跳出外部循环:break n
    • n:指定要跳出的循环层级

      • 默认情况下,n为1,表明跳出的是当前的循环
      • 若为2:break命令就会停止下一级的外部循环

continue命令

  • 提早结束执行循环内部的命令但不完全终止整个循环的一个途径
  • continue命令允许使用参数来指定要继续哪级循环:continue n
    • n:要继续的循环层级

处理循环的输出

  • 在shell脚本中,要么关节要么重定向循环的输出
  • 可以在done命令后面添加一个处理命令:
    • shell会将结果重定向到文件output.txt中,而不是显示在屏幕上

1

2

3

4

5

6

7

8

9

for file in /home/rich*

do

if [ -d "$file" ]

then

echo "$file is a directory"

elif

echo "$file is a file"

fi

done > output.txt

  • 这种方法同样适用于将循环的结果管接给另一个命令

    • 以下例子说明将输出的结果通过sort命令重新排序输出

Shell

1

2

3

4

5

6

...

for ...

...

done | sort

echo "This completes our place to go"

$

时间: 2024-10-13 06:00:44

shell脚本编程-循环(for、while、until)的相关文章

shell脚本编程循环之for/while/untill循环

循环执行: 将一段代码重复执行0.1或多次: 进入条件:条件满足时才进入循环: 退出条件:每个循环都应该有退出条件,以有机会退出循环: bash脚本: for循环 while循环 until循环 for循环: 两种格式: (1) 遍历列表 (2) 控制变量 (1)遍历列表: for  VARAIBLE  in  LIST; do 循环体 done 进入条件:只要列表有元素,即可进入循环: 退出条件:列表中的元素遍历完成: LISTT的生成方式: (1) 直接给出: (2) 整数列表 (a) {s

8.17_Linux之bash shell脚本编程入门篇(三)之循环以及函数function的使用

bash shell脚本编程入门篇(三)之循环 什么是循环执行? 将某代码段重复运行多次 重复运行多少次: 循环次数事先已知 循环次数事先未知 有进入条件和退出条件 相关命令:for, while, until,selet, for命令的使用 作用: 依次将列表中的元素赋值给"变量名"; 每次赋值后即执行一次循环体; 直到列表中的元素耗尽,循环结束 命令格式: for 变量名 in 列表; do 循环体(正常执行的执行命令) 语句1 语句2 语句3 ... done 列表生成方式: (

Shell脚本编程知识点总结及范例

 一:关于语言 1)编译性语言 编译型语言多半运作于底层,所处理的是字节.整数.浮点数或其它及其机器层经的对象.处理过程为:源程序--预处理--编译--汇编--链接,编译性语言为静态语言. 2)解释性语言 解释性语言读入程序代码并将其转化为内部的形式加以执行.处理过程:解释性(文本文件)-解释器去读取并执行.解释性语言为动态语言. 二:基础 变量类型 linux脚本中的变量不需要事先声明,而是直接定义使用(这点不同于其他高级编程语言中变量的使用)bash变量类型分为本地变量和环境变量. 本地变量

shell脚本编程——流程控制

shell脚本编程--流程控制 目   录 一. if 二. case 三. for 四. while 五. until 六. 综合应用 一.if 1.语法 (1)单分支 if  判断条件:then fi (2)双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi (3)多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; then 条件为真的分支代码 else 以上条件都为假

shell脚本编程的选择分支结构

选择执行结构: if语句单分支结构:如果条件为真,则执行then后的命令,否则,不做任何操作: if CONDITION :then STATEMENT fi 或 if CONDITION ; then STATEMENT1 STATEMENT2 ... fi 注意:想要执行then后面的STATEMENTS,前提条件是CONDITION部分为真: if语句的双分支结构:如果条件为真,就执行then后面的命令:否则就执行else后面的命令: if CONDITION ; then STATEME

Linux系统shell脚本编程——生产实战案例

Linux系统shell脚本编程--生产实战案例     在日常的生产环境中,可能会遇到需要批量检查内网目前在线的主机IP地址有哪些,还可能需要检查这些在线的主机哪些端口是开放状态,因此依靠手工来检查是可以实现,但比较费时费力,所以需要结合shell脚本来实现批量检查的功能,那么今天就来做个小小的实验. 1.开发脚本前准备 一般大家都知道,测试主机是否在线,常用的命令无非就是ping.nmap,因此,首先找一个地址来测试下ping命令的效果 [[email protected] scripts]

Linux中的shell脚本编程——函数

概述: 本章节将总结while,for循环语句的特殊用法,在不同的场景当中,更能发挥其功能和价值.除此之外,还会介绍一种特殊的循环语句select语句,实现菜单的作用.最重要的是讲解shell脚本编程中函数的用法.这些内容都要熟练掌握. 一.循环语句的特殊用法: 1.while循环的特殊用法(遍历文件的每一行): □语法:while read line; do 循环体 done < /PATH/FROM/SOMEFILE □意义:依次读取/PATH/FROM/SOMEFILE文件中的每一行,且将

Linux 的shell脚本编程

shell脚本编程 程序:指令+数据 程序编辑风格:             过程式:以指令为中心,数据服务于指令             对象式:以数据为中心,指令服务于数据 shell程序:提供了编程能力,解释执行 计算机:运行二进制指令 编程语言: 低级:汇编语言 高级:编译:高级语言-->编译器-->目标代码 java,c#,c,c++ 解释:高级语言-->解释器-->机器代码 shell,per,python 编程逻辑处理方式:           顺序执行      

Shell脚本编程30分钟入门

什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch test_$i.txt done 示例解释 第1行:指定脚本解释器,这里是用/bin/sh做解释器的 第2行:切换到当前用户的home目录 第3行:创建一个目录shell_tut 第4行:切换到shell_tut目录 第5行:循环条件,一共循环10次 第6行:创建一个test_1…10.txt文件 第7