第三章、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返回结果,而不是使用stdout0表示真,非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 教程 - 孟庆昌

posted @ 2022-07-05 21:00  lucky_light  阅读(265)  评论(0编辑  收藏  举报