第十三章、Shell 逻辑运算

在 Shell 中,任何一条命令的退出都有 两种布尔状态。 Shell 中用一个命令返回 0 代表真,返回其他值(1~255) 代表假。

在 Shell 中,可以 在命令执行后使用 特殊变量 $? 来获取最后一个命令的返回值。

true 命令和 false 命令

在 Shell 中有两个内置的命令 true 和 false 用来确定的返回真值和假值。

如:

weimingze@mzstudio:~$ true
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ false
weimingze@mzstudio:~$ echo $?
1

1. test 命令

test 命令的作用是 检测文件的类型比较两个值 并返回检测的布尔状态。

命令的语法

test 表达式
# 或
[ 表达式 ]

语法说明

常用文件表达式

表达式
说明
-f <FILE>
文件存在并且是一个普通文件
-d <FILE>
文件存在并且是一个文件夹
-e <FILE>
文件存在(不区分文件和文件夹)
-r <FILE>
文件存在并且用户有 权限
-w <FILE>
文件存在并且用户有 权限
-x <FILE>
文件存在并且用户有 执行 权限或进入权限(文件夹)
-s <FILE>
文件存在并且文件长度大于零
-b <FILE>
文件存在并且是块设备文件
-c <FILE>
文件存在并且是字符设备文件
-L <FILE>-h <FILE>
文件存在并且是一个符号链接文件
-p <FILE>
文件存在并且是一个命名管道文件
<FILE1> -ot <FILE2>
文件1 比 文件2 旧(修改时间)

示例

weimingze@mzstudio:~$ test -f /etc/passwd
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ [ -f /etc/passwd ]
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ [ -d /etc/passwd ]
weimingze@mzstudio:~$ echo $?
1
weimingze@mzstudio:~$ [ -d /etc/ ]
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ test -r /etc/shadow  # shadow 文件不允许普通用户读取
weimingze@mzstudio:~$ echo $?
1

字符串和整数比较表达式

表达式
说明
-n <字符串>
字符串的长度不是零(非空字符串)
-z <字符串>
字符串的长度是零(""
<字符串1> = <字符串2>
判断两个字符串相等
<字符串1> != <字符串2>
判断两个字符串不等
<整数1> -eq <整数2>
整数1 等于 整数2
<整数1> -ge <整数2>
整数1 大于等于 整数2
<整数1> -gt <整数2>
整数1 大于 整数2
<整数1> -le <整数2>
整数1 小于等于 整数2
<整数1> -lt <整数2>
整数1 小于 整数2
<整数1> -ne <整数2>
整数1 不等于 整数2

注意字符和整数两侧都要留有空格,因为这些都是参数(需要用空格分开)。

示例

weimingze@mzstudio:~$ [ -n "hello" ]
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ [ -n "" ]
weimingze@mzstudio:~$ echo $?
1
weimingze@mzstudio:~$ [ -z "" ]
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ [ 'ABC' == 'abc' ]
weimingze@mzstudio:~$ echo $?
1
weimingze@mzstudio:~$ [ 100 -gt 200 ]
weimingze@mzstudio:~$ echo $?
1
weimingze@mzstudio:~$ [ 100 -lt 200 ]
weimingze@mzstudio:~$ echo $?
0

常用逻辑运算表达式

表达式
说明
<表达式1> -a <表达式2>
表达式1 和 表达式2 两者都为真,结果才为真,否则结果为假
<表达式1> -o <表达式2>
表达式1 和 表达式2 只要有一个为真,结果旧为真,两者都为假结果才为假

示例

weimingze@mzstudio:~$ [ 200 -gt  100 -a "ABC" != "abc" ]
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ [ 200 -gt  100 -a "ABC" == "abc" ]
weimingze@mzstudio:~$ echo $?
1

要了解更多的表达式请参见手册 man test