第三章、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 教程 - 孟庆昌

浙公网安备 33010602011771号