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. JBPM表达业务流程(流程定义语言)

    业务流程包括三部分: 活动 Activity / 节点 Node (有很多种,不同的类型有不同的功能,必须要有一个Start Activity) 连线 Transition / 转移 (从一个Acti ...

  2. 【C语言】13-指针和字符串

    字符串回顾 一个字符串由一个或多个字符组成,因此我们可以用字符数组来存放字符串,不过在数组的尾部要加上一个空字符'\0'. char s[] = "李洪强"; 上面的代码定义了一个 ...

  3. Apache Commons CLI 简介

    CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被 ...

  4. Scrum会议10(Beta版本) 补交

    组名:天天向上 组长:王森 组员:张政.张金生.林莉.胡丽娜 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git.coding.n ...

  5. java的Arrays工具类实战

    java.util.Arrays类能方便地操作数组,它提供的所有方法都是静态的.静态方法是属于类的,不是属于类的对象.所以可以直接使用类名加方法名进行调用.Arrays作为一个工具类,能很好的操作数组 ...

  6. NBUT 1673 迷宫问题(DP)

    [1673] 迷宫问题 时间限制: 1000 ms 内存限制: 65535 K 问题描述 Alex的猫咪不小心走进了迷宫,Alex为了心爱的猫咪,决定进入迷宫去解救他的猫咪. 已知猫咪坐标为(n - ...

  7. 前端编码风格规范(3)—— JavaScript 规范

    JavaScript 规范 全局命名空间污染与 IIFE 总是将代码包裹成一个 IIFE(Immediately-Invoked Function Expression),用以创建独立隔绝的定义域.这 ...

  8. 2016.05.03,英语,《Vocabulary Builder》Unit 21

    sub, means 'under', as in subway, submarine, substandard. A subject is a person who is under the aut ...

  9. 每天学点GDB 15

    本节重点描述两个gdb集成测试环境 有没有办法在一边调试的时候,一边显示对应的源码呢?有没有一种工具能够将gdb集成到ide中呢,本文就试图回答这些问题. emacs gdb 在linux的世界里,e ...

  10. json解析json字符串时候,数组必须对应jsonObjectArray,不能对应JsonObject。否则会解析错误。

    json第三方解析json字符串时候,json数组必须对应jsonObjectArray,不能对应JsonObject.->只要是[]开头的都是json数组字符串,就要用jsonArray解析 ...