返回值
在说&&和||之前,不得不提下返回值。
shell中,一个命令如果成功执行会返回0,返回值会保存在变量$?
中,可以通过echo $?
查看,但需注意的是,该命令也会返回0,如:
[light@localhost ~]$ lq
bash: lq: 未找到命令...
[light@localhost ~]$ echo $?
127
[light@localhost ~]$ echo $?
0
这里先给出了一个不存在的命令,执行后返回127,我们用echo $?
查看该返回值,这时返回值就变成了0.
&&
有编程基础的同学都知道,这是与操作,而且是短路操作。真值表如下:
a | b | a&&b |
---|---|---|
假 | 假 | 假 |
假 | 真 | 假 |
真 | 假 | 假 |
真 | 真 | 真 |
通过它我们可以看到,当a为假时,a&&b一定为假。所以程序在执行时如果判定a为假,就直接返回假,不再判定b。也就是说,当且仅当a为真时,才判定b。
而在shell中,命令成功执行返回0,这里0就是真,非0就是假。
我们用test
命令去判断文件是否存在或具有相应的权限,现假设当前目录下只有hello一个文件,分别执行如下命令会显示什么?
test -e 用来判断是否存在该名称的文件或目录,若存在返回0,否则返回1
test -e hello && echo "exist"
test -e hello1 && echo "exist"
对于第一条,当执行完test -e hello
后,$?的值为0,为真, 继续执行后面的,故显示exist。
第二条,执行完test -e hello1
后,由于hello1不存在,返回1,为假,故不再执行后面的echo exist
,无显示。
||
或操作,只要有一个为真则结果为真,故也是短路操作,只要第一个操作数为真就不再执行后面的操作。
真值表
a | b | a||b |
---|---|---|
假 | 假 | 假 |
假 | 真 | 真 |
真 | 假 | 真 |
真 | 真 | 真 |
假设当前目录下只存在文件hello:
test -e hello || echo "not exist"
test -e hello1 || echo "not exist"
结果如下:
[light@localhost ~]$ test -e hello || echo "not exist"
[light@localhost ~]$ test -e hello1 || echo "not exist"
not exist
结合上述两个命令,就能实现如下功能啦:
给定一个文件,若文件存在,显示exist,否则显示not exist
test -e hello && echo "exist" || echo "not exist"
linux下这两个操作符的优先级似乎是一样的,所以这里也是从左向右执行。即,先判定出test -e hello && echo "exist"
再拿这个结果去和后面的部分执行或操作。