1. for 语句

bash shell 中 for 命令的基本格式如以下,$var 变量包含着这次迭代对应的当前列表项中的值。

for var in list
docommands
done

也可以将 do 语句和 for 语句放在同一行,但必须用分号将其同列表中的值分开:for var in list; do

1.1 读取列表中的值

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

$ cat test1
#!/bin/bash
# basic for command
for test in Alabama Alaska Arizona Arkansas California Colorado
doecho The next state is $test
done
$ ./test1
The next state is Alabama
The next state is Alaska
The next state is Arizona
The next state is Arkansas
The next state is California
The next state is Colorado
$

1.2 读取列中的复杂值

当列表中包含单引号时,需要使用转义字符或者双引号来定义用到单引号的值。

$ cat test2
#!/bin/bash
# another example of how not to use the for command
for test in I don\'t know if "this'll" work
doecho "word:$test"
done
$ ./test2
word:I
word:don't
word:know
word:if
word:this'll
word:work
$

记住,for循环假定每个值都是用空格分割的。

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

$ cat test3
#!/bin/bash
# an example of how to properly define values
for test in Nevada "New Hampshire" "New Mexico" "New York"
doecho "Now going to $test"
done
$ ./test3
Now going to Nevada
Now going to New Hampshire
Now going to New Mexico
Now going to New York
$

1.3 从变量读取列表

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

$ cat test4
#!/bin/bash
# using a variable to hold the list
list="Alabama Alaska Arizona Arkansas Colorado"
list=$list" Connecticut" # 向 list 变量中添加文本
for state in $list
doecho "Have you ever visited $state?"
done
$ ./test4
Have you ever visited Alabama?
Have you ever visited Alaska?
Have you ever visited Arizona?
Have you ever visited Arkansas?
Have you ever visited Colorado?
Have you ever visited Connecticut?
$

注意,代码还是用了另一个赋值语句向 $list 变量包含的已有列表中添加(或者说是拼接)了一个值。这是向变量中存储的已有文本字符串尾部添加文本的一个常用方法。

1.4 从命令读取值

可以用命令替换来执行任何能产生输出的命令,然后在 for 命令中使用该命令的输出。

$ cat test5
#!/bin/bash
# reading values from a file
file="states"
for state in $(cat $file)
doecho "Visit beautiful $state"
done
$ cat states
Alabama
Alaska
Arizona
Arkansas
Colorado
Connecticut
Delaware
Florida
Georgia
$ ./test5
Visit beautiful Alabama
Visit beautiful Alaska
Visit beautiful Arizona
Visit beautiful Arkansas
Visit beautiful Colorado
Visit beautiful Connecticut
Visit beautiful Delaware
Visit beautiful Florida
Visit beautiful Georgia
$

1.5 使用通配符读取目录

可以用 for 命令来自动遍历目录中的文件。进行此操作时,必须在文件名或路径名中使用通配符。它会强制 shell 使用文件扩展匹配。文件扩展匹配是生成匹配指定通配符的文件名或路径名的过程。

如果不知道所有的文件名,这个特性在处理目录中的文件时就非常好用。

$ cat test6
#!/bin/bash
# iterate through all the files in a directory
for file in /home/rich/test/*
doif [ -d "$file" ]   # 如果不用双引号包含,遇到目录和文件名包含空格时会失败thenecho "$file is a directory"elif [ -f "$file" ]thenecho "$file is a file"fi
done
$ ./test6
/home/rich/test/dir1 is a directory
/home/rich/test/myprog.c is a file
/home/rich/test/myprog is a file
/home/rich/test/myscript is a file
/home/rich/test/newdir is a directory
/home/rich/test/newfile is a file
/home/rich/test/newfile2 is a file
/home/rich/test/testdir is a directory
/home/rich/test/testing is a file
/home/rich/test/testprog is a file
/home/rich/test/testprog.c is a file
$

2. C 语言风格的 for 命令

待补充

3. while 命令

3.1 while 的基本格式

while test command
doother commands
done

while 命令的关键在于所指定的 test command 的退出状态码必须随着循环中运行的命令而
改变。如果退出状态码不发生变化, while 循环就将一直不停地进行下去。

最常见的 test command 的用法是用方括号来检查循环命令中用到的 shell 变量的值。

$ cat test10
#!/bin/bash
# while command test
var1=10
while [ $var1 -gt 0 ]
doecho $var1var1=$[ $var1 - 1 ]
done
$ ./test10
10
9
8
7
6
5
4
3
2
1
$

3.2 until 命令

until 命令和 while 命令工作的方式完全相反。until 命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为 0,bash shell 才会执行循环中列出的命令。一旦测试命令返回了退出状态码 0,循环就结束了。

until test commands
doother commands
done
$ cat test12
#!/bin/bash
# using the until command
var1=100
until [ $var1 -eq 0 ]
doecho $var1var1=$[ $var1 - 25 ]
done
$ ./test12
100
75
50
25
$

4. 控制循环

4.1 break 命令

break 命令是退出循环的一个简单方法。可以用 break 命令来退出任意类型的循环,包括 while 和until 循环。

$ cat test17
#!/bin/bash
# breaking out of a for loop
for var1 in 1 2 3 4 5 6 7 8 9 10
doif [ $var1 -eq 5 ]thenbreakfiecho "Iteration number: $var1"
done
echo "The for loop is completed"
$ ./test17
Iteration number: 1
Iteration number: 2
Iteration number: 3
Iteration number: 4
The for loop is completed
$

4.2 continue 命令

continue 命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。

5. 处理循环的输出

可以对循环的输出使用管道或进行重定向。这可以通过在 done 命令之后添加一个处理命令来实现。

for file in /home/rich/*
doif [ -d "$file" ]thenecho "$file is a directory"elifecho "$file is a file"fi
done > output.txt

shell 会将 for 命令的结果重定向到文件 output.txt 中,而不是显示在屏幕上。

6. 更改字段分隔符

内部字段分隔符(internal field separator),IFS 环境变量定义了 bash shell 用作字段分隔符的一系列字符。

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

  • 空格
  • 制表符
  • 换行符

在处理代码量较大的脚本时,可能在一个地方需要修改 IFS 的值,然后忽略这次修改,在脚本的其他地方继续沿用 IFS 的默认值。一个可参考的安全实践是在改变 IFS 之前保存原来的 IFS 值,之后再恢复它。

这种技术可以这样实现:

IFS.OLD=$IFS
IFS=$'\n'

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

IFS=$IFS.OLD

这就保证了在脚本的后续操作中使用的是 IFS 的默认值。如果要指定多个IFS字符,只要将它们在赋值行串起来就行。

IFS=$'\n':;"

这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。

Linux shell 学习笔记(9)— 循环语句(for、while)以及更改字段分隔符相关推荐

  1. Linux shell 学习笔记(8)— 使用结构化命令(if-then 语句、数值比较、字符串比较、文件比较、case 语句)

    1. 使用 if-then 语句 最基本的结构化命令就是if-then语句.if-then语句有如下格式. if command then ​ commands fi 或者 if command; t ...

  2. C++学习笔记4[循环语句]

    C++学习目录链接: C++学习笔记目录链接(持续更新中) 文章目录 一.while循环 二.do...while循环 三.do...while循环与while循环区别 四.for循环 五.循环控制 ...

  3. Linux shell 学习笔记(16)— shell 入门总结

    1. Shell 变量 Shell 变量包括自定义变量和环境变量: 自定义变量:脚本中自己命名定义的变量,通常为局部变量,其他 Shell 程序不能访问到: 环境变量,操作系统已定义的变量,如 PAT ...

  4. Python学习笔记:循环语句

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  5. linux shell 学习笔记

    shell中定义变量形式: yourname='tengxi' 注意等号两边不能有空格,否则会报语法错误 使用变量 echo $yourname 或者 echo ${yourname}(推荐带花括号的 ...

  6. java嵌套循环语句_Java学习笔记(七) 循环语句

    一.for循环语句 1.1 循环结构 循环结构的组成: 初始语句:用于表示循环开启的起始状态,简单说就是循环开始的时候什么样 条件判断语句:用于表示循环反复执行的条件,简单说就是判断循环是否能一直执行 ...

  7. Linux shell 学习笔记(2)— 监测程序、磁盘空间和处理文件(ps -ef、top、kill、df、du 、grep、tar)

    1. 监测程序 1.1 检查进程 默认情况下,ps 命令只会显示运行在当前控制台下的属于当前用户的进程. $ ps PID TTY TIME CMD 3081 pts/0 00:00:00 bash ...

  8. Linux | Shell 学习笔记(二)Shell 流程控制 if、case、for、while| read读取输入 | 函数的使用 | cut、sed、awk、sort命令 +Demo

    文章目录 参考资料 运行环境 一.流程控制 1.1 if 判断 1.2 case 语句 1.3 for 循环 1.4 while 循环 二. read 读取控制台输入 三.函数 3.1 系统函数 ba ...

  9. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)

    1. 理解输入和输出 1.1 标准文件描述符 Linux 系统将每个对象当作文件处理.这包括输入和输出进程.Linux 用文件描述符(file descriptor)来标识每个文件对象.文件描述符是一 ...

最新文章

  1. 工程师文化:BAT 为什么不喊老板
  2. C++中如何访问全局变量和全局函数
  3. UVA 12034 Race
  4. JPA学习(6)JPQL
  5. 买房贷款被拒,该如何补救?
  6. ruby elixir_如何使用Elixir和Phoenix快速入门构建CRUD REST API
  7. java 合并到一行_mysql中将多行数据合并成一行数据
  8. 助你成为嵌入式高手的100多个软硬件开源项目
  9. B/S应用中的ActiveX数字签名相关问题杂谈
  10. cacti批量添加脚本
  11. 千年虫← 2000, 2020→千年虫现身Splunk 平台,立即修复!
  12. awstats 日志分析
  13. 【通俗易懂的通信】贝叶斯公式 全概率公式 及其理解
  14. Verilog基础知识4(常用集成门电路的逻辑符号对照表)
  15. gauscoor软件怎么用_高斯坐标经纬度转换器
  16. 中级软件设计师JAVA
  17. Git 基础之远程仓库-2.5
  18. Python3快速入门—7.枚举
  19. 《windows程序设计(C语言版)》笔记
  20. Spring Cloud Eureka 全解 (1) - 总览篇

热门文章

  1. 浅显易懂 Makefile 入门 (01)— 什么是Makefile、为什么要用Makefile、Makefile规则、Makefile流程如何实现增量编译
  2. mac git使用与配置踩过的坑
  3. 确定修改——取消修改
  4. SpringBoot集成AOP管理日志
  5. pytorch学习笔记(九):PyTorch结构介绍
  6. github下载慢,轻松提速教程
  7. 如何通过HTTP优雅调用第三方-Feign
  8. ARM系列处理器和架构
  9. 编译器设计-自下而上分析器-误差恢复-语义分析
  10. 利用NVIDIA-NGC中的MATLAB容器加速语义分割