Linux · 2023-11-15 0

《Linux命令行与shell脚本编程大全》读书笔记03

循环

13.1 for命令

当list中包含 包含单引号的单词 可采用方法:使用反斜线转义单引号 使用双引号来定义含有单引号的值

当list中包含 包含空格的值 必须将其放入双引号内,因为for命令使用空格来划分列表中的每个值

示例:

$test变量的值在shell脚本的剩余部分仍旧有效

运行:

从变量中读取值列表

可以将list保存在变量中,使用for时遍历该变量中的整个值列表

便于值列表追加(拼接)新项 var=$var” value”

示例:

输出:

从命令中读取值列表

可以用命令替换来执行任何能产生输出的命令,生成值列表

输出:

可见 New York 和 North Carolina 各拆分成两行输出,但这不是我们想要的结果

更改命令分隔符

IFS环境变量定义了bash shell用作字段分隔符的一系列字符。 在默认情况下,bash shell会将 空格,制表符,换行符 视为字段分隔符。

可在shell脚本中临时更改IFS环境变量的值来限制被bash shell视为字段分隔符的字符

在先前的脚本加入语句IFS=$’\n’,得到输出:

如果想修改IFS的值,使其只能识别换行符,可以将语句IFS=$'\n'加入脚本,告诉bash shell忽略数据中的空格和制表符

在处理代码量较大的脚本时,可能在一个地方需要修改IFS的值,然后再将其恢复原状,使脚本的其他地方继续沿用IFS的默认值。可在修改IFS之前保存原来的IFS值,之后再恢复它:

还有一些比较常用的用法,比如:

如果要遍历文件中以冒号分隔的值,只需把IFS的值设为冒号: IFS=:

如果要指定多个IFS字符,只需在赋值语句中将这些字符写在一起: IFS=$'\n:;"'

使用通配符读取目录

可以用for命令来自动遍历目录中的文件。为此必须在文件名或路径名中使用通配符。

输出:

注意:在这个例子中使用了语句if [ -d “$file” ] 因为在linux内,目录名和文件名包含空格是合法的。面对这种情况,就需要把$file放入双引号内

也可以在for命令中列出多个目录通配符,如: for file in /home/rich/.b* /home/rich/badtest

13.2 C语言风格的for命令

for (( a = 1; a < 10; a++ ))

  • 变量赋值可以有空格
  • 迭代条件中的变量不以$符号开头
  • 迭代中的算式不使用expr命令格式

也可以使用多个变量,示例:

输出:


13.3 while命令

test command的退出状态码必须随着循环中执行的命令而改变

while命令允许多个测试命令,但只有最后一个测试命令的退出状态码会被用于决定是否结束循环

要把每个测试命令放在单独的一行中

输出:


13.4 until命令

until命令要求指定一个返回非0退出状态码的测试命令,只要测试命令的退出状态码不为0,bash shell就会执行循环中列出的命令;当测试命令返回了退出状态码0,循环终止。

test command的退出状态码必须随着循环中执行的命令而改变

输出:

13.5 嵌套循环

while for until循环可嵌套使用

13.6 循环处理文件数据

示例:处理/etc/passwd文件

外层IFS解析出文件的各行,内层IFS将IFS的值修改为冒号,已解析出/etc/passwd文件中各行的字段

输出:

13.7 循环控制

break

默认跳出最内层循环

通过语句 break n可结束外层循环 在默认情况下,n为1,表明跳出的是当前循环 如果将n设为2,那么break命令就会停止下一级的外层循环

输出:

可见,当shell执行了break命令后,外部循环就结束了

continue

和break命令一样,可通过 continue n 指定n来指定要指定继续哪一级循环

输出:

13.8 处理循环的输出

可以在done命令之后,对循环的输出使用管道或进行重定向

输出: