第十三章、Shell 逻辑运算
在 Shell 中,任何一条命令的退出都有 真 或 假 两种布尔状态。 Shell 中用一个命令返回 0 代表真,返回其他值(1~255) 代表假。
在 Shell 中,可以 在命令执行后使用 特殊变量 $? 来获取最后一个命令的返回值。
true 命令和 false 命令
在 Shell 中有两个内置的命令 true 和 false 用来确定的返回真值和假值。
true返回真值(0)。false返回假值(1)。
如:
weimingze@mzstudio:~$ true
weimingze@mzstudio:~$ echo $?
0
weimingze@mzstudio:~$ false
weimingze@mzstudio:~$ echo $?
1
1. test 命令
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。