条件控制
1.if
语法格式:
注意:expression
和方括号([ ])之间必须有空格,否则会有语法错误
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
1
2
3
4
2
3
4
if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句
if ... fi 语句
if ... else ... fi 语句
if ... elif ... else ... fi 语句
1
2
3
2
3
if
和 elif
后的条件表达式必须跟随 then
,以明确指示在条件为真时要执行的命令块,then
起到区分条件部分和执行部分的作用,省略 then
会使解析器无法正确理解语句结构,从而导致语法错误
实例:
#!/bin/bash/
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater to b"
else
echo "a is less to b"
fi
# if ... else 语句也可以写成一行,以命令的方式来运行
a=10;b=20;if [ $a == $b ];then echo "a is equal to b";else echo "a is not equal to b";fi;
# if ... else 语句也经常与 test 命令结合使用,作用与上面一样
if test $a == $b
then
echo "a is equal to b"
else
echo "a is not equal to b"
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2.case
case ... esac
与其他语言中的 switch ... case
语句类似,是一种多分支选择结构
#!/bin/bash/
grade="B"
case $grade in
"A") echo "Very Good!";;
"B") echo "Good!";;
"C") echo "Come On!";;
*)
echo "You Must Try!"
echo "Sorry!";;
esac
# 转换成C语言是:
#include <stdio.h>
int main(){
char grade = 'B';
switch(grade){
case 'A': printf("Very Good!");break;
case 'B': printf("Very Good!");break;
case 'C': printf("Very Good!");break;
default:
printf("You Must Try!");
printf("Sorry!");
break;
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
需要注意的是: 取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;
;;
与其他语言中的 break
类似,意思是跳到整个 case
语句的最后
取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 *
捕获该值,再执行后面的命令
3.for
语法:
for 变量 in 列表
do
command1
command2
...
commandN
done
1
2
3
4
5
6
7
2
3
4
5
6
7
实例:
#!/bin/bash/
for value in 1 2 3 4 5
do
echo "The value is $value"
done
# 输出
The value is 1
The value is 2
The value is 3
The value is 4
The value is 5
# 顺序输出字符串中的字符
for str in This is a string
do
echo $str
done
# 输出
This
is
a
string
# 遍历目录下的文件
# 在 Bash 脚本中,* 是一个通配符(wildcard),用于匹配当前目录下的所有文件和目录,在 for 循环中使用 *,它会扩展为当前目录中所有的# 文件和目录名
for FILE in *
do
echo $FILE
done
# 遍历文件内容
citys=`cat city.txt`
for city in $citys
do
echo $city
done
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
4.while
只要while后面的条件满足,就一直执行do里面的代码块
语法:
while command
do
Statement(s) to be executed if command is true
done
1
2
3
4
2
3
4
实例:
#!/bin/bash
c=0;
while [ $c -lt 3 ]
do
echo "Value c is $c"
# 这里由于shell本身不支持算数运算,所以使用expr命令进行自增
c=`expr $c + 1`
done
# 输出
Value c is 0
Value c is 1
Value c is 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
5.util
until 循环执行一系列命令直至条件为 true 时停止
#!/bin/bash
c=0;
# do里面的语句块一直在运行,直到满足了until的条件就停止
until [ $c -eq 3 ]
do
echo "Value c is $c"
c=`expr $c + 1`
done
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
6.break、continue
break命令允许跳出所有循环
在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环:break n,break 会退出最内层的 n 个循环
continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环