概述
在 Bash 中,如果需要让多条命令按顺序执行,则有这样方法,如表 1 所示。
多命令执行符 | 格 式 | 作 用 |
---|---|---|
; | 命令1 ; 命令2 | 多条命令顺序执行,命令之间没有任何逻辑关系 |
&& | 命令1 && 命令2 | 如果命令1正确执行($?=0),则命令2才会执行 如果命令1执行不正确($?≠0),则命令2不会执行 |
II | 命令1 || 命令2 | 如果命令1执行不正确($?≠0),则命令2才会执行 如果命令1正确执行($?=0),则命令2不会执行 |
";"多命令顺序执行
如果使用分号";"连接多条命令,那么这些命令会一次执行,但是各命令之间没有任何逻辑关系,不论哪条命令报错了,后面的命令仍会依次执行。例如:
cd /user命令出错不影响其他命令的执行,所以当我们需要一次执行多条命令,而这些命令之间又没有可逻辑关系时,就可以使用";"来连接多条命令。
[root@localhost ~]# ls ; date; cd /user; pwdanaconda-ks.cfg Tue Nov 20 20:59:42 CST 2018-bash: cd: /user: No such file or directory/root
"&&"逻辑与
如果使用"&&"连接多条命令,那么只有第一条命令正确执行了,"&&"连接的第二条命令才会执行。在Bash中通过预定义变量 $?来判断上一条命令是是否执行成功,如果 $? 返回值是 0,则证明上一条命令正确执行;如果 $? 返回值是非 0,则证明上一条命令执行错误。
例如: 复制/root/test到/tmp/test,如果命令成功则删除原文件,并打印"yes"。在执行过程中,因为没有test这个文件或目录,所以cp命令无法获取"/root/test"的文件状态(stat),,所以第一条命令执行不正确,第二和第三条命令也都不执行了。
[root@localhost ~]# cp /root/test /tmp/test && rm -rf/ root/test && echo yes
通常在安装源码包时,需要执行"./configure"、"make"和"make install"命令,但是在安装软件时又需要等待较长时间,则可以利用"&&"同时执行这三条命令,例如
[root@localhost ~]# cd httpd-2.2.9[root@localhost httpd-2.2.9]# ./configure --prefix=/usr/ local/apache2 && make && make install
"||"逻辑或
如果使用"||"连接多条命令,则只有前一条命令执行错误,后一条命令才能执行。
例如:因为无法访问/root/test:没有那个文件或目录,所以用ls命令查看时报错了。因为第一条命令执行错误,所以第二条命令才正确执行
[root@localhost ~]#ls /root/test || mkdir/root/tdir
在脚本中如果我们想要判断某条命令是否正确执行,就可以使用下面命令:
因为/root/test文件不存在,第一条命令报错,则第二条命令不能正确执行,因为第二条命令执行错误,所以第三条命令正确执行,打印"no"
[root@localhost ~]#ls /root/test && echo "yes"||echo "no"