在 Bash 中,如果需要让多条命令顺序执行,则有这样方法,如表 1 所示。

表 1 多命令顺序执行的方法

多命令执行符

格 式

作 用

命令1 ; 命令2

多条命令顺序执行,命令之间没有任何逻辑关系

&&

命令1 && 命令2

如果命令1正确执行($?=0),则命令2才会执行

如果命令1执行不正确($?≠0),则命令2不会执行

II

命令1 || 命令2

如果命令1执行不正确($?≠0),则命令2才会执行

如果命令1正确执行($?=0),则命令2不会执行

";"多命令顺序执行

如果使用";"连接多条命令,那么这些命令会一次执行,但是各命令之间没有任何逻辑关系,也就是说,不论哪条命令报错了,后面的命令仍会依次执行。举个例子:

[root@localhost ~]# ls ; date; cd /user; pwd

anaconda-ks.cfg err.log install.log install.log.syslog list.log out.log

sh

#ls命令正确执行

2013年 10月 21 日星期一 11:35:57 CST

#date命令正确执行

-bash: cd: /user:没有那个文件或目录

#cd命令报错,因为没有/user目录

/root

#虽然cd命令报错,但是并不影响pwd命令的执行

这就是";"的作用,不论前一条命令是否正确执行,都不影响后续命令的执行。再举一个例子:

[root@localhost ~]# date; dd if=/dev/zero of=/root/

testfile bs=1k count=100000;

date

#创建一个大小为100MB的文件,通过";"可以确定需要多长时间

2013 年 10月21日 星期一 11:41:54 CST

#第一条date命令执行

记录了 100000+0的读入

记录了 100000+0的写出

102400000字节(102 MB)已复制,2.09394 秒,48.9 MB/秒

#dd命令执行

2013 年 10月 21 日星期一11:41:56 CST #第二条date命令执行,可以判断dd命令用时2秒

[root@localhost ~]# ll -h testfile

-rw-r--r--. 1 root root 98M 10月21 11:41 testfile

#大小为100MB的testfile文件已经建立

当我们需要一次执行多条命令,而这些命令之间又没有可逻辑关系时,就可以使用";"来连接多条命令。

"&&"逻辑与

如果使用"&&"连接多条命令,那么这些命令之间就有逻辑关系了。只有第一条命令正确执行了,"&&"连接的第二条命令才会执行。那么,命令 2 是如何知道命令 1 正确执行了呢?

这就需要 Bash 的预定义变量 $? 的支持了,如果 $? 返回值是 0,则证明上一条命令正确执行;如果 $? 返回值是非 0,则证明上一条命令执行错误。

举个例子:

[root@localhost ~]# cp /root/test /tmp/test && rm -rf/ root/test && echo yes

cp:无法获取"/rooWest"的文件状态(stat):没有那个文件或目录

#复制/root/test到/tmp/test,如果命令成功则删除原文件,并打印"yes"

#因为/root/test文件不存在,所以第一条命令执行不正确,第二和第三条命令也都不执行

[root@localhost ~]# ls /tmp/

#在/tmp/目录中并没有建立test文件

[root@localhost ~]# touch /root/test

#建立/root/test文件

[root@localhost ~]# cp /root/test /tmp/test && rm -rf/ root/test && echo yes

yes

#第一条命令正确执行后,第二和第三条命令都正确执行

#所以打印了"yes"

[root@localhost ~]# ll /root/test

ls:无法访问/root/test:没有那个文件或目录

#源文件/root/test消失,因为第二条命令rm正确执行

[root@localhost ~]# ll /tmp/test

-rw-r--r--. 1 root root 010月 2113:16/tmp/test

#在/temp/目录中正确建立了test文件

再举一个例子,我们在安装源码包时,需要执行"./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

在这里,"\"代表一行命令没有输入结束,因为命令太长了,所以加入"\"字符,可以换行输入。利用"&&"就可以让这三条命令同时执行,然后我们就可以休息片刻,等待命令结束。

不过大家请思考一下,这里是否可以把"&&"替换为或"ll"呢?当然是不行的,这三条安装命令必须在前一条命令正确执行之后,才能执行后一条命令,如果把"&&"替换为";",则不管前命令是否正确执行,后一条命令都会执行。如果把"&&"替换为"||",则只有前一条命令执行错误,后一条命令才会执行。

"||"逻辑或

如果使用"||"连接多条命令,则只有前一条命令执行错误,后一条命令才能执行。举个例子:

[root@localhost ~]#ls /root/test || mkdir/root/tdir

ls:无法访问/root/test:没有那个文件或目录

#因为已经删除了/root/tesy文件,所以用ls命令查看时报错了

#因为第一条命令执行错误,所以第二条命令才正确执行

[root@localhost ~]#ll -d /root/tdir/

drwxr-xr-x. 2 root root 4096 10月21 13:39/root/tdir/

#把root/tdir/目录已经被建立了

"&&"和"||"非常有意思,如果我们想要判断某条命令是否正确执行,就可以这样来做:

[root@localhost ~]# 命令 && echo "yes" || echo "no"

例如:

[root@localhost ~]#ls /root/test && echo "yes"||echo "no"

ls:无法访问/root/test:没有那个文件或目录

no

#因为/root/test文件不存在,第一条命令报错,所以,第二条命令不能正确执行

#因为第二条命令执行错误,所以第三条命令正确执行,打印"no"

[root@localhost ~]# touch /root/test

[root@localhost ~]# ls /root/test && echo "yes" || echo "no"

/root/test

yes

#因为第一条命令正确执行,所以第二条命令正确执行,打印"yes"

#因为第二条命令正确执行,所以第三条命令执行错误

Logo

更多推荐