Linux Shell基础篇六 - 流程控制
if else语句
if用于条件判断逻辑控制语句。
if 语法:
1
2
3
4
5
6
7
8#多行写法
if 条件
then
命令
fi
#单行写法
if 条件; then 命令; fiif else 语法:
1
2
3
4
5
6if 条件
then
命令
else
命令
fiif elif else 语法:
1
2
3
4
5
6
7
8
9
10
11
12
13if 条件1
then
命令1
elif 条件2
then
命令2
elif 条件3
then
命令3
……
else
命令N
fi
示例:
1 |
|
(())
是一种数学计算命令,它除了可以进行最基本的加减乘除运算,还可以进行大于、小于、等于等关系运算,以及与、或、非逻辑运算。当 a 和 b 相等时,(( $a == $b ))
判断条件成立,进入 if,执行 then 后边的 echo 语句。
更多关于(())
的介绍,可参考Linux Shell - 运算符。
if条件判断句的退出状态
linux任何命令的的执行都会有一个退出状态,无论是内置命令还是外部文件命令,还是自定义的 Shell 函数,当它退出(运行结束)时,都会返回一个比较小的整数值给调用(使用)它的程序,这就是命令的退出状态。
大多数命令状态0代表成功,非0代表失败。也有特殊的命令,比如 diff
命令用来比较两个文件的不同,对于“没有差别”的文件返回 0,对于“找到差别”的文件返回 1,对无效文件名返回 2。
Shell 中,有多种方式取得命令的退出状态,其中 $?
是最常见的一种。
退出状态和逻辑运算符的组合
Shell if 语句使用逻辑运算符将多个退出状态组合起来,这样就可以一次判断多个条件了。
运算符 | 使用格式 | 说明 |
---|---|---|
&& 或 -a | 条件1 && 条件2 | 逻辑与运算符,当 条件1 和 条件2 同时成立时, 整个表达式才成立。 如果检测到 条件1 的退出状态为 0, 就不会再检测 条件2 了,因为不管 条件2 的退出状态是什么, 整个表达式必然都是不成立的,检测了也是多此一举。 |
|| 或 -o | 条件1 || 条件2 | 逻辑或运算符,条件1 和 条件2 两个表 达式中只要有一个成立,整个表达式就成立。 如果检 测到 条件1 的退出状态为 1,就不会再检测 条件2 了,因为 不管 条件2 的退出状态是什么,整个表达式必然都是成立的, 检测了也是多此一举。 |
! | !条件 | 逻辑非运算符,相当于”取反“的效果。如果 条件 成立,那么整 个表达式就不成立;如果 条件 不成立,那么整个表达式就成立。 |
演示:
1 |
|
test命令用于对文件或字符串进行检测, -w
判断文件是否存在并且可写,-n
用于检测字符串是否非空,$data > $filename
其中 >
用于将内容输出到指定文件中去。
由于布尔运算符
-a
只能用在[]
中,而[]
会发生word splitting,即字符串会按空格进行分割,这样一来$data
中就不能包含空格,有2种办法可以解决这个问题:
- 为
$data
加上双引号:if [ -w $filename -a -n "$data" ]
- 使用逻辑运算符
&&
并配合[[]]
:if [[ -w $filename && -n $data ]]
case语句
Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令;当分支较多,并且判断条件比较简单时,使用 case in 语句就比较方便了。
1 |
|
每一匹配模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;
(类似break)。取值将检测匹配的每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。case
、in
和 esac
都是 Shell 关键字, esac就是case的反写在这里代表结束case。
匹配模式:可以是一个数字、一个字符串,甚至是一个简单正则表达式。简单正则表达式支持如下通配符:
格式 | 说明 |
---|---|
* | 表示任意字符串。 |
[abc] | 表示 a、b、c 三个字符中的任意一个。比如,[15ZH] 表示 1、5、Z、H 四个字符中的任意一个。 |
[m-n] | 表示从 m 到 n 的任意一个字符。比如,[0-9] 表示任意一个数字,[0-9a-zA-Z] 表示字母或数字。 |
| | 表示多重选择,类似逻辑运算中的或运算。比如,abc | xyz 表示匹配字符串 “abc” 或者 “xyz”。 |
演示:
1 |
|
while语句
whlie用于循环执行一系列命令。
1 |
|
演示:指定输出多少次hello world
1 |
|
无限循环语法:
1 |
|
until语句
until 也是循环结构语句,until 循环与 while 循环在处理方式上刚好相反,循环条件为false会一直循环,条件为true停止循环。
1 |
|
条件如果返回值为1(代表false),则继续执行循环体内的语句,否则跳出循环。
示例:指定输出多少次hello world
1 |
|
该例子和上文中的while
示例实现的是同样的效果。
for语句
与其他编程语言类似,Shell同样支持for循环。
循环方式一
1 |
|
var
是循环变量,item1 item2 ... itemN
是循环的范围。
示例:输出5次hello world
1 |
|
循环方式二
1 |
|
start
表示循环范围的起始值,必须为整数;end
表示循环范围的结束值,必须为整数。
示例:循环1到5并打印
1 |
|
循环方式三
1 |
|
示例:打印5次hello world
1 |
|
无限循环语法:
1 |
|
select语句
select in 循环用来增强交互性,它可以显示出带编号的菜单,用户输入不同的编号就可以选择不同的菜单,并执行不同的功能。
select in 是 Shell 独有的一种循环,非常适合终端(Terminal)这样的交互场景,而其他语言则没有。
1 |
|
注意:select 是无限循环(死循环),输入空值,或者输入的值无效都不会结束循环,只有遇到 break 语句,或者按下 Ctrl+D
组合键才能结束循环。
执行命令过程中,终端会输出 #?
代表可以输入选择的菜单编号。
示例1:
1 |
|
示例2:
1 |
|