shell脚本编程基础(四)

结构化命令(二)

for命令

在这里插入图片描述
for命令,允许你创建一个遍历一系列值的循环。每次迭代都使用其中一个值来执行已定义好的一组命令。
只要你愿意,也可以将do语句和for语句放在同一行,但必须用分号将其同列表中的值分开: for var in list; do

使用转义字符(反斜线)来将单引号转义;
在这里插入图片描述
在第一个有问题的地方添加了反斜线字符来转义don’t中的单引号。在第二个有问题的地方将this’ll用双引号圈起来。两种方法都能正常辨别出这个值。
for循环假定每个值都是用空格分割的。如果在单独的数据值中有空格,就必须用双引号将这些值圈起来。
在这里插入图片描述
$list变量包含了用于迭代的标准文本值列表。注意,代码还使用了另一个赋值语句向该变量包含的已有列表中添加(或者说是拼接)了一个值。这是向变量中存储的已有文本字符串尾部添加文本的一个常用方法。
在这里插入图片描述
在这里插入图片描述
IFS=:
如果要指定多个IFS字符,只要将它们在赋值行串起来就行。
IFS=美元符号’\n’:;"
这个赋值会将换行符、冒号、分号和双引号作为字段分隔符。如何使用IFS字符解析数据没有任何限制。

C语言风格的for循环

在这里插入图片描述
注意,有些部分并没有遵循bash shell标准的for命令:
 变量赋值可以有空格;
 条件中的变量不以美元符开头;
 迭代过程的算式未用expr命令格式。

while命令

在这里插入图片描述
while循环会在测试条件不再成立停止
while echo $var1 显示了var1变量的当前值。
[ $var1 -ge 0 ] 判断var1变量的值。(是否大于等于0)
在这里插入图片描述
while循环会在var1变量等于0时执行echo语句,然后将var1变量的值减一。接下来再次执行测试命令,用于下一次迭代。
echo测试命令被执行并显示了var变量的值(现在小于0了)。直到shell执行test测试命令, whle循环才会停止。

until命令

until命令要求你指定一个通常返回非零退出状态码的测试命令。只有测试命令的退出状态码不为0, bash shell才会执行循环中列出的命令。
一旦测试命令返回了退出状态码0,循环就结束了。
until test commands
do
other commands
done
在until命令语句中放入多个测试命令。只有最后一个命令的退出状态码决定了bash shell是否执行已定义的other commands。
在这里插入图片描述

嵌套循环

注意,在使用嵌套循环时,你是在迭代中使用迭代,与命令运行的次数是乘积关系。
在这里插入图片描述
这个脚本使用了两个不同的IFS值来解析数据。第一个IFS值解出/etc/passwd文件中的单独的行。内部for循环接着将IFS的值修改为冒号,允许你从/etc/passwd的行中解析出单独的值。
内部循环会解析出/etc/passwd每行中的各个值。这种方法在处理外部导入电子表格所采用的逗号分隔的数据时也很方便。

控制循环

break命令&continue命令

for循环通常都会遍历列表中指定的所有值。但当满足if-then的条件时, shell会执行break命令,停止for循环。
while循环会在if-then的条件满足时执行break命令,终止。

跳出外部循环:break n
其中m制定了要跳出的循环层级。默认n为1,表明跳出的是当前的循环。如果n为2则停止下一级的外部循环。

continue命令可以提前中止某次循环中的命令,但并不会完全终止整个循环。可以在循环内部设置shell不执行命令的条件。

和break命令一样, continue命令也允许通过命令行参数指定要继续执行哪一级循环:
continue n
其中n定义了要继续的循环层级。

处理循环的输出
在shell脚本中,你可以对循环的输出使用管道或进行重定向。这可以通过在done命令之后添加一个处理命令来实现。
done > output.txt
shell会将for命令的结果重定向到文件output.txt中,而不是显示在屏幕上。
在这里插入图片描述
shell创建了文件test23.txt并将for命令的输出重定向到这个文件。 shell在for命令之后正常显示了echo语句。

扫描二维码关注公众号,回复: 10155433 查看本文章

查找可执行文件,创建多个用户账户
userid,user name
第一个条目是你为新用户账户所选用的用户ID。第二个条目是用户的全名。两个值之间使用逗号分隔,这样就形成了一种名为逗号分隔值的文件格式(或者是.csv)。
读取文件中的数据,将IFS分隔符设置成逗号,并将其放入while语句的条件测试部分。然后使用read命令读取文件中的各行。
while IFS=’,’ read –r userid name
read命令会自动读取.csv文本文件的下一行内容,所以不需要专门再写一个循环来处理。当read命令返回FALSE时(也就是读取完整个文件时), while命令就会退出。
把数据从文件中送入while命令,只需在while命令尾部使用一个重定向符就可以了。
#!/bin/bash
process new user accounts
input=“users.csv”
while IFS=’,’ read -r userid name
do
echo “adding 美元符号userid”
useradd -c “美元符号name” -m 美元符号userid
done < “美元符号input”

小结

for命令允许你遍历一系列的值,不管是在命令行里提供好的、包含在变量中的还是通过文件扩展匹配获得的文件名和目录名。

while命令使用普通命令或测试命令提供了基于命令条件的循环。只有在命令(或条件)产生退出状态码0时, while循环才会继续迭代指定的一组命令。

until命令也提供了迭代命令的一种方法,但它的迭代是建立在命令(或条件)产生非零退出状态码的基础上。这个特性允许你设置一个迭代结束前都必须满足的条件。
可以在shell脚本中对循环进行组合,生成多层循环。 bash shell提供了continue和break命令,允许你根据循环内的不同值改变循环的正常流程。

bash shell还允许使用标准的命令重定向管道来改变循环的输出。你可以使用重定向来将循环的输出重定向到一个文件或是另一个命令。这就为控制shell脚本执行提供了丰富的功能。

发布了38 篇原创文章 · 获赞 55 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_44710568/article/details/105095582