目录
完整笔记请前往此处获取:https://download.csdn.net/download/qq_55908180/88366003
循环是编程的一部分,bash shell提供了三种可以用于脚本的循环命令。
1、for命令允许遍历一系列的值,不管是在命令行里提到的、在变量中的还是通过文件扩展匹配获得的文件名或目录名;
2、while命令提供了基于命令条件的循环,只有在命令产生退出状态码0时,循环才会继续迭代下一条指定的命令;
3、until命令和while的迭代条件相反。
1、for命令
for命令允许创建一个遍历一系列值的循环,在bash shell中for命令的基本格式:
for var in list do commands done
有几种不同的方法可以指定在迭代中需要提供的的一系列值:1、在每次迭代中,变量var会包含列表中的当前值,第一次迭代会使用列表中的第一个值,第二次使用第二个值,并以此类推;2、在do 和done语句之间的输入命令可以是一条或多条shell命令,在这些命令中。$var变量包含着这次迭代对应的当前列表项中的。
1.1、读取列表中的值
for命令最基本的用法就是遍历for命令自身定义的一系列值。如:
1.2、读取列表中的复杂值
由于shell遇到单引号 会尝试使用它们来定义一个单独的数据值,会引发不希望的错误,可以通过以下两种方法解决:1、使用转义字符(反斜线)来把单引号转义;2、使用双引号定义用到单引号的值。如:
由于for循环默认每个值都是用空格分割的,如果想在单独的数据中有空格,就必须用双引号把想要的值圈起来。如:
1.3、从变量读取列表
也可以通过for命令完成遍历集中存储了一系列值的变量的整个列表。如:
注意:代码还用了另外一个赋值语句向$list变量包含的已有列表中添加一个值,这是一种向变量中存储的已有文字字符串尾部添加文本的常用方法。
1.4、从命令读取值
生成列表中所需值的另外一个途径就是使用命令的输出。如:
1.5、更改字段分隔符
注意,states文件中每行只有一个字符串,不是通过空格分隔的,如果给出一个带有空格的字符串,for命令仍会将每个单词当做单独的值,这是由于特殊的环境变量IFS(内部字段分隔符)造成的,在默认情况下,shell会把:空格、制表符、换行符当做字段分隔符。想要解决这问题,可以在shell脚本中临时更改IFS环境变量的值来限制被shell当做字段分隔符的字符。如你想修改IFS只能识别换行符,就可以这么做:IFS =$'\n'。如:
关于IFS还有一些有意思的用法:
- 假如要遍历一个文件中用冒号分隔的值,就可以把IFS的值设为冒号。如:IFS=:
- 如果要指定多个IFS字符,只要把它们串起来就行。如:IFS=$’\n’:;”
这里就是把换行符、冒号、分号和双引号作为分隔符
1.6、用通配符读取目录
for命令还可以用来自动遍历目录的文件,但是,在遍历时,必须在文件名或路径名中使用通配符,它会强制shell使用文件扩展匹配。文件扩展匹配就是生成匹配指定通配符的文件名或路径名的过程。如果不知道所有的文件名,这个特性在处理目录中的文件时就非常好用。如:
2、C语言风格的for命令
2.1、C语言的for命令
C语言风格的for循环的基本格式:for (( variable assignment ; condition ; iteration process ))
注意,有些部分并没有遵循标准的for命令:
1、变量赋值可以有空格;
2、条件中的变量不以美元符开头;
3、迭代过程的算式没有使用expr命令格式。如:
2.2、使用多个变量
C语言风格的for命令还允许为迭代使用多个变量,可以为每个变量定义不同的迭代过程,循环会单独处理每个变量,但是,在for循环中只能定义一种条件。如:
3、while命令
某种意义上说,while命令是if-then语句和for循环的组合体。while命令允许定义一个要测试的命令,只要定义test命令返回的退出状态码为0,就可以循环执行一组命令,否则,while命令会停止执行那一组命令。
3.1、while基本格式
While的基本格式是:while test command do other commands done
值得注意的是:while命令的关键在于所指定的test command 的退出状态码必须随着循环中运行的命令而改变。如果退出状态码不发生变化,while循环就会一直运行下去。最常用的就是用方括号来检查循环命令中用到的shell变量的值。如:
3.2、使用多个测试命令
while命令允许定义多个测试命令,注意:只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环。如:
4、Until命令
until命令和while命令工作方式完全相反,until命令要求你指定一个通常返回非零退出状态码的测试命令,只要退出状态码不为0,shell就会执行循环中列出的命令,一旦退出状态码为0,循环就结束了。until命令的格式:
until test commands do other commands done 如:
until命令也可以使用多个测试命令。如:
5、嵌套循环
循环语句可以在循环中使用任意类型的命令,包括其他循环命令。如:
6、循环处理文件数据
循环处理文件数据就必须遍历存储在文件中的数据,有两种技术可以实现遍历:
1、使用嵌套循环;
2、修改IFS环境变量。
7、控制循环
有两个命令可以帮助我们控制循环:
1、break命令;
2、continue命令
7.1、break命令
该命令是退出循环的一个简单方法,同时,该命令也可以退出任意类型的循环,包括while和until循环。下面是break的常见用法:
7.1.1、跳出单个循环
7.1.2、跳出内部循环
在处理多个循环时,break命令会自动终止最内层的循环。
7.1.3、跳出外部循环
break命令接受单个命令行参数值:break n 其中n指定了要跳出的循环层级,n默认为1,表明跳出当前的循环,如果n设为2,则意味着停止下一级的外部循环。
7.2、continue命令
continue命令可以提前终止某次循环中的命令,但不会完全终止整个循环。可以在循环内部设置shell不执行命令的条件。
注:当if-then语句满足值大于3且小于6时,shell就会执行continue命令,跳过此次循环中剩余的命令。
8、处理循环的输出
在shell脚本中,可以对循环的输出使用管道或进行重定向。
在本例中shell创建了文件test.txt并把for命令的输出重定向到这个文本中。
9、例子:
9.1、找出系统中有哪些可执行文件可供使用。
9.2、创建多个用户账户
为节省时间,不去为每一个需要创建的新用户手动输入useradd命令,可以把需要添加的新用户放在一个文本文档中,然后通过脚本处理。文本格式如:userid,user name。第一条目是为新用户所选的ID,第二条目是用户全名。记得把该文本保存为.csv格式,以备shell脚本读取和处理。
这里因为useradd命令需要root权限,记得sudo一下,以防报错。