第三章、test命令于判断符号
逻辑运算符&&和||
&&
表示与,||
表示或- 为了节省计算量,
&&
和||
都具备短路原则,利用短路原则,可以简单实现 if else 作用
expr1 && expr2
: 当expr1
为假时,expr2
不被执行
expr1 || expr2
: 当expr1
为真时,expr2
不被执行 - 表达式中
exit code
为0表示真,为1表示假,这和c/c++完全相反 - 注意和
expr
命令中的&
和|
区分
test 命令
在命令行中输入man test
,可以查看test
命令用法。
test
用于判断文件类型,以及对变量比较。
test
命令用exit code
返回结果,而不是使用stdout
。0表示真,非0表示假
然而 expr 是用 stdout 输出结果, 1表示真,0表示假
xyg@vivo-xyg:~$ test 3 -lt 4 # 为真,返回值为0
xyg@vivo-xyg:~$ echo $? # 输出 test 命令的返回值,输出0
下面有一个利用 && || 实现简单的 if else 语句
xyg@vivo-xyg:~$ ls # 列出文件夹下的所有文件
Desktop Downloads Pictures Public Videos
Documents Music programs Templates xyg
xyg@vivo-xyg:~$ test -e xyg && echo "exist" || echo "not exist" # xyg 文件存在,输出 exist
exist
xyg@vivo-xyg:~$ test -e lucky-light && echo "exist" || echo "not exist" # lucky-light 文件不存在,输出 not exist
not exist
文件类型判断
命令格式:
test -e filename # 判断文件是否存在
test -f filename # 判断是否为文件
test -d filename # 判断是否为目录
用法:
xyg@vivo-xyg:~/xyg/acw_test$ ls -l # 显示所有文件的详细信息
total 8
-rwxrwxr-x 1 xyg xyg 229 7月 4 20:28 expr.sh
drwxrwxr-x 2 xyg xyg 4096 7月 5 20:34 xyg_dir_test
-rw-rw-r-- 1 xyg xyg 0 7月 5 20:34 xyg_file_test
xyg@vivo-xyg:~/xyg/acw_test$ test -e expr.sh # expr.sh 文件存在
xyg@vivo-xyg:~/xyg/acw_test$ echo $?
0
xyg@vivo-xyg:~/xyg/acw_test$ test -e xyg_dir_test # xyg_dir_test 文件夹存在
xyg@vivo-xyg:~/xyg/acw_test$ echo $?
0
xyg@vivo-xyg:~/xyg/acw_test$ test -e xyg_file_test # xyg_file_test 文件存在
xyg@vivo-xyg:~/xyg/acw_test$ echo $?
0
xyg@vivo-xyg:~/xyg/acw_test$ test -e xyg_file_te # xyg_file_te 文件不存在
xyg@vivo-xyg:~/xyg/acw_test$ echo $?
1
test -e 是判断文件是否存在,这里的文件包括了文件夹和文件。
文件权限判断
命令格式:
test -r filename # 判断filename文件是否可读
测试参数 | 代表含义 |
---|---|
-r | 文件是否可读 |
-w | 文件是否可写 |
-x | 文件是否可执行 |
-s | 文件是否为空 |
其中-s 判断文件是否为空比较奇怪 |
整数间的比较
命令格式:
test $a -eq $b # 判断 a, b 是否相等
测试参数 | 代表含义 | 缩写 |
---|---|---|
-eq | 判断a是否等于b | equal |
-ne | 判断a是否不等于b | none equal |
-lt | 判断a是否小于b | less than |
-gt | 判断a是否大于b | greater than |
-le | 判断a是否小于等于b | less equal |
-ge | 判断a是否大于等于b | greater equal |
字符串比较
语句 | 代表含义 |
---|---|
test -z STR | 判断 STR 是否为空,空为True,exit code=0 |
test -n STR | 判断 STR 是否为非空,非空为True, exit code=0 |
test STR1 == STR2 | 判断 STR1 STR2是否相等,相等为True, exit code=0 |
test STR1 != STR2 | 判断 STR1 STR2是否不相等,不相等为True, exit code=0 |
也可以比较大小关系,但是需要转义 |
遇到文件字符串字典序比较,一旦忘记写转义,直接爆炸,文件覆盖了都
多重条件判定
命令格式:
test -r filename -a -x filename # 判断文件是否可读且可执行
参数 | 代表含义 |
---|---|
-a | 与 and test 3 -le 3 -a 4 -eq 5 |
-o | 或 or test 3 -le 3 -o 4 -eq 5 |
! | 非 not test ! ( 3 -le 3 -a 4 -eq 5 ) |
判断符号 []
[]
和test
用法几乎一模一样,更长常用于 if
语句中。另外[[]]
是[]
的加强版,支持的特性更多。
例如:
xyg@vivo-xyg:~/programs$ [ 3 -ne 4 -a 5dsf == 5dsf ] # 试一试 [] 的用法是否和 test 一致
xyg@vivo-xyg:~/programs$ echo $? # 输出 0 表示真
xyg@vivo-xyg:~/xyg/acw_test$ ls # 列出目录下的所有文件
expr.sh xyg_dir_test xyg_file_test
xyg@vivo-xyg:~/xyg/acw_test$ [ -e expr.sh ] && echo "exist" || echo "not exist" # 判断expr.sh 文件是否存在
exist
xyg@vivo-xyg:~/xyg/acw_test$ [ -e expr2.sh ] && echo "exist" || echo "not exist" # 判断expr2.sh 文件是否存在
not exist
注意点
- []内的每一项都要用空格隔开
- 中括号内的变量,最好用双引号括起来
- 中括号内的常数,最好用单或双引号括起来
xyg@vivo-xyg:~/xyg/acw_test$ name="luckylight xyg"
xyg@vivo-xyg:~/xyg/acw_test$ [ $name == "luckylight xyg" ] # 因为 $name 中含有空格,语法出现错误
bash: [: too many arguments
xyg@vivo-xyg:~/xyg/acw_test$ [ "${name}" == "luckylight xyg" ]
参考链接
强烈推荐y总的Linux基础课
Linux 教程 - 孟庆昌