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"
$

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

  1. centos shell脚本编程2 if 判断 case判断 shell脚本中的循环 for while shell中的函数 break continue test 命令 第三十六节课

    centos  shell脚本编程2 if 判断  case判断   shell脚本中的循环  for   while   shell中的函数  break  continue  test 命令   ...

  2. shell脚本编程(一) 变量、条件判断、循环

    目录   1. shell脚本编程   2. 运行 Shell 脚本有两种方法   3. 变量   4. 本地变量   5. 环境变量   6. 参数变量   7. 多行注释   8. if条件判断 ...

  3. Shell脚本编程30分钟入门

    Shell脚本编程30分钟入门 转载地址: Shell脚本编程30分钟入门 什么是Shell脚本 示例 看个例子吧: #!/bin/sh cd ~ mkdir shell_tut cd shell_t ...

  4. Linux shell脚本编程(三)

    Linux shell脚本编程 流程控制: 循环语句:for,while,until while循环: while CONDITION; do 循环体 done 进入条件:当CONDITION为“真” ...

  5. Linux shell脚本编程(二)

    Linux shell脚本编程(二) 练习:求100以内所有偶数之和; 使用至少三种方法实现; 示例1: #!/bin/bash # declare -i sum=0 #声明一个变量求和,初始值为0 ...

  6. Linux shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  7. Linux shell脚本编程基础之练习篇

    shell脚本编程基础之练习篇. 1.编写一个脚本使我们在写一个脚本时自动生成”#!/bin/bash”这一行和注释信息. #!/bin/bash ] then echo "请输入一个参数& ...

  8. 【Linux】Shell脚本编程(一)

    Linux shell脚本编程: 守护进程,服务进程:启动?开机时自动启动: 交互式进程:shell应用程序 广义:GUI,CLI GUI: CLI: 词法分析:命令,选项,参数 内建命令: 外部命令 ...

  9. Shell脚本编程总结及速查手册

    Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...

随机推荐

  1. 五、Pillar数据管理中心

    Pillar是数据管理中心. Pillar在saltstack中主要作用是存储和定义一些配置管理中需要的信息(比如:软件版本,用户名,密码等) 修改pillar相关配置文件: [root@super6 ...

  2. IOS 开发的官方文档链接

    下面这些文章都是苹果官方的开发文档,非常有用: iOS Developer Library https://developer.apple.com/library/ios/navigation/ 总入 ...

  3. 微博开发平台java SDK demo学习之examples(demo)

    本文介绍demo中函数的功能分块 账号 评论 收藏 关系/好友分组 地理信息 OAuth2(开发指南) 位置服务(开发指南)

  4. 将服务器上的某些特定日志统一保存至XPS文件

    <APACHost.CSV> Hostname,IP,OSType srv1,10.103.22.22,Win2003 srv2,10.103.22.37,Win2008   Import ...

  5. CSS架构

    CSS架构 有趣的是,我们通常不这样评判其他语言.一个Rails开发者不会因为他写的代码规范就认为他是一个好的开发者.因为这是最基本的.当然它必须是满 足规范,除此以外还要考虑其他方面:代码是否有可读 ...

  6. PHP 设计模式 笔记与总结(2)开发 PSR-0 的基础框架

    [PSR-0 规范的三项约定]: ① 命名空间必须与绝对路径一致 ② 类名的首字母必须大写 ③ 除入口文件外,其他".php"必须只有一个类(不能有可执行的代码) [开发符合 PS ...

  7. Unity 为NGUI增加体感输入方式

    背景 NGUI在处理UI和输入方面确实做的不错,但是现在的问题是公司引入体感之后,是通过手的位置来实现按钮的点击操作,前提我不想改变原先设计好的NGUI界面和机制,怎么破? NGUI的输入底层机制 N ...

  8. Spring IoC反转控制的快速入门

    * 下载Spring最新开发包 * 复制Spring开发jar包到工程 * 理解IoC反转控制和DI依赖注入 * 编写Spring核心配置文件 * 在程序中读取Spring配置文件,通过Spring框 ...

  9. day12

    JSP指令   JSP指令概述 JSP指令的格式:<%@指令名 attr1="" attr2="" %>,一般都会把JSP指令放到JSP文件的最上方 ...

  10. [收藏]Asp.net MVC生命周期

    一个HTTP请求从IIS移交到Asp.net运行时,Asp.net MVC是在什么时机获得了控制权并对请求进行处理呢?处理过程又是怎样的? 以IIS7中asp.net应用程序生命周期为例,下图是来自M ...