在某些情况下,很多命令我想要一次输入去执行,而不想要分次执行时,该如何是好?
基本上有两个选择,
- 一个是通过shell脚本脚本去执行,
- 一种则是通过下面的介绍来一次入多个命令。
1.cmd:cmd(不考虑命令相关性的连续命令执行)
在某些时候,我们希望可以一次执行多个命令,例如在关机的时候我希望可以先执行两次syn
同步写入磁盘后才shutdown计算机,那么可以怎么做?
这样做:
sync; sync; shutdown -h now
在命令与命令中间利用分号(;)来隔开,这样一来,分号前的命令执行完后就会立刻接着执行后面的命令。
这真是方便,再来,换个角度来想,万一我想要在某个目录下面建立一个文件,也就是说,如果该目录存在的话,那我才建立这个文件;如果不存在,那就算了。
也就是说这两个命令彼此之间是有相关性的,前一个命令是否成功执行与后一个命令是否要执行有关,那就得动用到&&或||
2.$?(命令返回值)与&&或||
如同上面谈到的,两个命令之间有依赖性,而这个依赖性主要判断的地方就在于前一个命令执行的结果是否正确。
我们曾介绍过命令返回值吧!
嘿嘿,没错,您真聪明,就是通过这个返回值。
【若前一个命令执行的结果为正确,在Linux下面会返回一个$?=0的值】
那么我们怎么通过这个返回值来判断后续的命令是否要执行?
这就得要借由【&&】及【||】的帮忙了。
注意,两个&之间是没有空格的,这个|则是[Shift]+[\]的按键结果。
命令执行情况 | 说明 |
cmd1 && cmd2 | 1.若 cmd1执行完毕且正确执行($?=0),则开始执行cmd2 2.若cmd1 执行完毕且为错误($?≠0),则cmd2不执行 |
cmd1 || cmd2 | 1.若cmd1执行完毕且正确执行($?=0),则cmd2不执行 2.若cmd1执行完毕且为错误($?≠0),则开始执行cmd2 |
上述的cmd1及cmd2都是命令。
好了,回到我们刚刚假想的情况,就是想要:
- (1)先判断一个目录是否存在;
- (2)若存在才在该目录下面建立一个文件。
由于我们尚未介绍判断式(test)的使用.
在这里我们使用Is以及返回值来判断目录是否存在,让我们进行下面这个练习看看:
范例一:使用ls 查看目录/tmp/abc 是否存在,若存在则用touch建立/tmp/abo/hehe.
ls很干脆的说明找不到该目录,但并没有touch 的错误,
看到了吧?如果 /tmp/abc 不存在时,touch 就不会被执行,若/tmp/abc存在的话,那么touch就会开始执行,很不错吧!
不过,我们还得手动自行建立目录,伤脑筋,能不能自动判断,如果没有该目录就给予建立?
参考一下下面的例子:
范例二:测试/tmp/abc是否存在,若不存在则予以建立,若存在就不做任何事情。
结果出现了,有进行mkdir。
如果你一再重复执行【Is /tmp/abc || mkdir /tmp/abc】也不会出现重复mkdir的错误,这是因为/tmp/abc已经存在,所以后续的mkdir就不会进行。这样理解了么?
好了,让我们再次讨论一下,如果我想要建立/tmp/abc/hehe 这个文件,但我并不知道/tmp/abc是否存在,那该如何是好?试试看:
范例三:我不清楚/tmp/abc是否存在,但就是要建立/tmp/abc/hehe文件。
上面这个范例三总是会尝试建立/tmp/abc/hehe,不论/tmp/abc 是否存在。
那么范例三应该如何解释?
由于Linux下面的命令都是由左往右执行,所以范例三有几种结果我们来分析一下:
- 若 /tmp/abc 不存在所以返回$?≠0,则因为||遇到非为0的$?所以开始mkdir /tmp/abc,由于mkdir /tmp/abc会成功进行,所以返回$?=0,因为&&遇到$?=0故会执行touch /tmp/abc/hehe,最终hehe就被建立了;
- 若/tmp/abc存在故返回$?=0,则因为||遇到0的$?不会进行,此时$?=0继续向后传,故因为&&遇到$?=0就开始建立/tmp/abc/hehe了,最终/tmp/abc/hehe 被建立。
整个过程跟c语言的&&和||是不是特别像啊
3.例题
以 Is 测试/tmplvbirding 是否存在,若存在则显示“exist";若不存在,则显示“not exist"。
答:这又牵涉到逻辑判断的问题,如果存在就显示某个数据,若不存在就显示其他数据,那我可以这样做:
ls /tmp/vbirding && echo "exist" || echo "not exist"
意思是说,当Is/tmp/vbirding 执行后,若正确,就执行echo "exist”,若有问题,就执行echo"not exist",
那如果写成如下的状况会出现什么?
ls /tmp/vbirding || echo "not exist" && echo "exist"
这其实是有问题的,为什么呢?
我们知道命令是一个一个往后执行,因此在上面的例子当中,如果/tmp/vbirding不存在时,它会进行如下操作:
- 1.若Is /tmp/vbirding不存在,因此返回一个非0的数值;
- 2.接下来经过 ||的判断,发现前一个命令返回非0的数值,因此,程序开始执行 echo"not exist"
- 而echo"not exist"程序肯定可以执行成功,因此会返回一个0值给后面的命令;
- 3.经过&8的判断,咦,是0,所以就开始执行echo "exist";
所以,嘿嘿,第二个例子里面竟然会同时出现not exist与exist,真神奇。
经过这个例题的练习,你应该会了解,由于命令是一个接着一个去执行的,因此,如果真要使用判断,那么这个&&与||的顺序就不能搞错。
一般来说,假设判断式有三个,也就是:
command1 && command2 || command3
而且顺序通常不会变,因为一般来说,command2与command3会使用肯定可以执行成功的命令
因此,根据上面例题的逻辑分析,您就会晓得为何要如此使用,这很有用的,而且考试也很常考。