结构控制
Bash中结构控制关键字有:if for while util cast select
if
1 | [root@vm-101 ~]# if [ 111 -eq 111 ]; then # 如果111 -eq 111(-eq等于) |
上面只有一个判断条件,如果有多个判断条件呢?
1 | [root@vm-101 ~]# if [ 111 -eq 112 ]; then # 第一个条件测试 |
注意:
[
是一个命令,]
也是一个命令,是关键字,它们是配对的。命令前后应该有什么?应该有空格或者
;&
这类符号。不然bash就会找不到这个命令。类似的还有
[[ ]]
切记切记,初学者常犯的错误(比如曾今的我)。
for
循环控制
1 | [root@vm-101 ~]# for i in 1 2 3 4 # 循环打印1 2 3 4 |
1 | [root@vm-101 ~]# list=(11 22 33 44) |
1 | [root@vm-101 ~]# for (( i=0; i<=10; i++ )) # 遍历一个数学表达式 |
这种语法类似C语言中的for循环。
i=0,定义$i的初始值为0
i<=10,定义$i<=10时,不退出for循环。只要不满足这个条件,for循环就结束。
i++,for循环没执行一次,都需要执行下这个操作。可以理解成步进。
写for循环的时候要非常小心,非常容易造成死循环。下面演示几种:
1 | [root@vm-101 ~]# for (( i=0; ; i++ )); do echo $i; done |
这种情况没有指定for循环的退出条件,就没办法退出for循环,会一直跑下去,知道天荒地老,海枯石烂。
1 | [root@vm-101 ~]# for (( i=0; i<=10; )); do echo $i; done |
这种情况有退出条件,但是这个条件永远也不会满足。因为没有指定步进。
要避免这种情况怎么办?
break
1 | [root@vm-101 ~]# for (( i=0; ; i++ )); do |
continue
1 | [root@vm-101 ~]# for (( i=0; i<=5; i++ )); do |
while
类似for循环,可以根据自己喜好和实际环境替换。
1 | [root@vm-101 ~]# i=5 |
用while遍历文件
1 | [root@vm-101 ~]# cat /etc/hosts | while read line |
这里用到了前面学的管道。
又遇到了一个新的命令read。暂时不用细究这个read是干嘛的。先把read line
简单理解成读取文件中的一行。
这里有两行,就是循环了两次。
验证下:
1 | [root@vm-101 ~]# cat /etc/hosts | while read line; do echo $line; echo ------------- ; done |
在每次循环中都打印了一串————-。这里出现了两次,所以就是循环了两次。
在while循环中同样可以使用break
和continue
1 | [root@vm-101 ~]# i=10 |
while循环同样要注意避免死循环
until
与while相反。直至条件为真时退出。
1 | [root@vm-101 ~]# a=0 |
case
比if ... elif ... elif ... elif ... else ... fi
更优雅的一种写法。
其实也优雅不到哪里去。个人感觉和一堆if else没有太大的区别。但是还是要学习学习的。
1 | [root@vm-101 ~]# a=1 |
select
有点类似for循环。不过它是一个交互式的
1 | [root@vm-101 ~]# list=(11 22 33 44) |
1 | [root@vm-101 ~]# select i in ${list[@]}; do echo $i; break; done |
也可以结合break
来退出select。