文章目录
- 命令执行的判断根据:;、&&、||
- cmd ; cmd(不考虑命令相关性的连续命令执行)
- $?(命令返回值)与&&或||
- 使用案例
- 例题
命令执行的判断根据:;、&&、||
在某些情况下,我想要一次执行很多命令,而不想分次执行时,该怎么办?基本上你有两种选择,一个是通过shell脚本去执行,一种则是通过下面的介绍来输入多个命令。
cmd ; cmd(不考虑命令相关性的连续命令执行)
在某些时候,我们希望可以一次执行多个命令,例如关机的时候我希望可以执行两次 sync同步写入磁盘后才shutdown计算机,那么可以怎么做呢?
[root@localhost ~]# sync ; sync ; shutdown -h now
在命令与命令中间利用分号【;】开隔开,这样一来,分号前的命令执行完后就立刻接着执行后面的命令。
那么我如果想在某个目录下面建一个文件,也就是说,如果该目录存在的话,那我才建立文件,如果不存在,那就不创建文件。也就是说这两个命令彼此之间是由相关性的,前一个命令是否成功执行与后一个命令要是否执行有关,那就要用&&或||
$?(命令返回值)与&&或||
如同上面谈到的,两个命令之间有依赖性,而这个依赖性主要判断的地方就在于前面一个命令的执行结果是否正确。判断原理就是【若前面一个命令执行结果正确,在Linux下面就会返回一个$?=0的值】
命令执行情况 | 说明 |
---|---|
cmd1 && cmd2 | 1. 若cmd1 执行完毕且正确执行($?=0),则开始执行cmd2 2. 若cmd1 执行完毕且为错误($?≠0),则cmd2不执行 |
cmd1 || cmd2 | 1. 若cmd1 执行完毕且正确执行($?=0),则cmd2 不执行 2. 若cmd1 执行完毕且为错误($?≠0),则开始执行cmd2 |
上述cmd1 及 cmd2 都是命令。
使用案例
使用ls 查看目录/tmp/abc是否存在,若存在则用touch 建立/tmp/abc/heh
[root@localhost ~]# ls /tmp/abc/ && touch /tmp/abc/hehe
ls: cannot access /tmp/abc/: No such file or directory
# ls说无法访问/tmp/abc/: 没有那个文件或目录,并没有touch的错误,表示touch并没有执行。
[root@localhost ~]# mkdir /tmp/abc
[root@localhost ~]# ls /tmp/abc/ && touch /tmp/abc/hehe
[root@localhost ~]# ll /tmp/abc/hehe
-rw-r--r--. 1 root root 0 Apr 25 16:20 /tmp/abc/hehe
看到了吧,/tmp/abc不存在,touch就不会执行,若/tmp/abc存在的话,那么touch就会开始执行。不过这样非常麻烦!能不能自动判断,如果没有该目录就自己建立一个
[root@localhost ~]# rm -rf /tmp/abc/ # 先删除此目录方便测试
[root@localhost ~]# ls /tmp/abc || mkdir /tmp/abc
ls: cannot access /tmp/abc: No such file or directory # ls报错没有/tmp/abc
[root@localhost ~]# ll -d /tmp/abc
drwxr-xr-x. 2 root root 6 Apr 25 16:23 /tmp/abc # mkdir创建了
如果你再重复执行【ls /tmp/abc || mkdir /tmp/abc】也不会出现重复mkdir 的错误,这是因为/tmp/abc已经存在了,后续的mkdir 就不会执行。
如果我想要建立/tmp/abc/hehe这个文件,但我不知道/tmp/abc是否存在,那该如何是好?
[root@localhost ~]# ls /tmp/abc || mkdir /tmp/abc && touch /tmp/abc/hehe
上述案例种尝试建立/tmp/abc/hehe,不乱/tmp/abc 是否存在。那么案例三应该如何解释?由于Linux下面的命令都是由左向右执行,所以说上述案例有几种情况来分析一下:
-
(1) 若/tmp/abc 不存在故返回 $?≠0,则 (2) 因为 || 遇到非为 0 的$?故开始 mkdir /tmp/abc ,由于mkdir /tmp/abc 会成功执行,所以返回 $?=0 (3) 遇到$?=0 故会执行 touch /tmp/abc/hehe 最终hehe被建立
-
(2) 若/tmp/abc存在故返回 $?=0 则(2) 因为|| 遇到0的$?不会执行,此时 $?=0继续向后传,故(3)因为遇到$?=0 开始建立 /tmp/abc/hehe 了,最终 /tmp/abc/hehe 被建立
整个流程图如下:
上面这张图的两股数据种,上方的线程为不存在 /tmp/abc 时所进行的命令操作,下方的线段则是存在 /tmp/abc 的命令操作。
例题
以ls 测试/tmp/csq 是否存在,若存在则显示 “yes” 不存在则显示 “no”
[root@localhost ~]# ls /tmp/csq && echo "yes" || echo "no"
ls: cannot access /tmp/csq: No such file or directory
no
练习到这里你应该知道了,命令是一个接着一个去执行的,因此,如果真的使用判断,那么整个 && 与 || 的顺序不能搞错。一般来说,假设判断式有三个,也就是:
command1 && command2 || command3
一般来说 command2 和command3 会使用肯定可以执行的成功的命令。