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. MyLinerLayout--推荐

    苹果系统的自动布局需要在布局的过程中建立各种各样的依赖,虽然后续使用masonry还算比较便捷. 有一天朋友推荐给我的这个,看了一下demo和这个库的作者的博客,了解到这个库并不是基于苹果的自动布局作 ...

  2. 通过ReflectionMethod,我们可以得到Person类的某个方法的信息

    PHP反射api由若干类组成,可帮助我们用来访问程序的元数据或者同相关的注释交互.借助反射我们可以获取诸如类实现了那些方法,创建一个类的实例(不同于用new创建),调用一个方法(也不同于常规调用),传 ...

  3. [听听音乐]when you believe [singer: mariah carey]

    movie: prince of egypt Lyrics   Many nights we prayed With no proof anyone could hear In our hearts ...

  4. 达内培训:php在线端口扫描器

    达内培训:php在线端口扫描器 [来源] 达内    [编辑] 达内   [时间]2012-12-21 这个扫描器很简单.就是用了一个数组来定义端口的相关信息,原理就是用fsockopen函数连接,如 ...

  5. 学习VS生活

    很多时候,失败的原因归结为一点:我没有时间...代码敲不完,我真的是没有时间么?很多时候是没意识的浪费时间 我每次进教室,总能看到吴刚和赵东亮在敲代码,为啥他们有时间呢?很多时候,时间就像那啥,挤一挤 ...

  6. he time that it takes to bring a block from disk into main memory

    DATABASE SYSTEM CONCEPTS, SIXTH EDITION There is a trade-off that the system designer must make betw ...

  7. 【转】PHP框架性能测试报告 - ThinkPHP 3.2.3 Laravel 5.2 Yii2.0.5

    作为一个PHP开发者,而且是初创企业团队的技术开发者,选择开发框架是个很艰难的事情. 用ThinkPHP的话,招聘一个刚从培训机构出来的开发者就可以上手了,但是性能和后期代码解耦是个让人头疼的事情.不 ...

  8. jquery 事件 多次绑定,多次触发,怎么清除历史绑定事件

    Jquery在处理事件的时候有时候会遇到预想不到的结果 如下 <a id="link_foo">Foo</a> <script type=" ...

  9. 告诉你Hadoop是什么

    Hadoop是什么?Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算机组成的集群中对海量数据进行分布式计算. Hadoop框架中 ...

  10. CSS :before和:after (转)

    前几天的晚上较全面的去看了下css的一些文档和资料,大部分的样式运用都没什么大问题了,只是有些许较陌生,但是也知道他们的存在和实现的是什么样式.今天主要想在这篇学习笔记中写的也不多,主要是针对:bef ...