if语句@bash

if you jump, i push you :)

介绍

if语句让我们可以测试某种条件,然后根据测试结果改变程序执行流程。
其一般格式为:

1
2
3
4
5
if command_test
then
command
command
fi

其中,command_test是要要执行的命令,该命令的退出状态会被测试;如果退出状态为0,执行thenfi之间的命令;否则,跳过这些命令。

注意:命令正常执行会返回状态码0;管道的状态码是最后一个命令的状态码。

if语句也可以加入else,形如下:

1
2
3
4
5
6
if command_test
then
commands
else
commands
fi

if语句也可以加入elif,形如下:

1
2
3
4
5
6
7
8
9
if command_test1
then
commands
elif command_test2
then
commands
else
commands
fi

特殊变量

变量$?被shell自动设置为最后一条命令的退出状态。

使用示例如下:

1
2
3
4
5
6
7
$ cat on
user="$1"

if who | grep "^$user " > /dev/null
then
echo "$user is logged on"
fi

test命令

test命令是shell环境中测试条件表达式的实用工具。其形如:

1
test expression

test会对expression求值,如果结果为真,则返回为0的退出状态码;如果结果为假,则返回非0的退出状态码。

test字符操作符小抄如下:

EXPRESSIONTRUE CASE
str1 = str2str1等于str2
str1 != str2str1不等于str2
strstr不为空
-n strstr不为空
-z strstr为空

注意后两种情况即-n str-z str,见下例:

1
2
3
4
5
6
7
$ blank="    "
$ test $blanks
$ echo $?
1
$ test "$blanks"
$ echo $?
0

test整数操作符小抄如下:

EXPRESSIONTRUE CASE
int1 -eq int2int1等于int2
int1 -ge int2int1大于或等于int2
int1 -gt int2int1大于int2
int1 -le int2int1小于或等于int2
int1 -lt int2int1小于int2
int1 -ne int2int1不等于int2

test文件操作符小抄如下:

OPTIONTRUE CASE
-e file存在
-d file目录
-s file非空文件
-f file普通文件
-L file符号链接
-r file可读取
-w file可写入
-x file可执行

test的另外一种格式:test还有一个别名[,因此可以用另外一种格式来表示:

1
[ expression ]

其中[是命令名,但如果写成这种格式表达式结尾处必须有对应的],并且[之后与]之前必须有空格。

逻辑操作符
一元逻辑否定操作符!可以放置在任意的test之前,否定该表达式的求值结果;
操作符-a在两个表达式之间执行逻辑与运算,求值满足短路规则;
操作符-o在两个表达式之间执行逻辑或运算,求值满足短路规则。

之外,-o优先级低于-a;也可以使用括号来改变求值顺序,但括号本身要被引用起来,因为它们对于shell有特殊的含义。

参考资料

UNIX/Linux/OS X中的Shell编程@ISBN: 9787115470416:https://book.douban.com/subject/30410589/

0%