Shell脚本中多命令逻辑执⾏顺序的⽅法详解
Linux中可以使⽤分号“;”、双and号“&&”和双竖线“||”来连接多个命令。单"&"符号也算命令连接符号,只不过它是将其前⾯的命令放⼊后台执⾏,所以可以变相地实现命令并⾏执⾏。
1.分号";"
command1 ; command2
命令之间没有逻辑关系。分号连接的命令会按照顺序从前向后依次执⾏,但分号两端的命令之间没有任何逻辑关系,所有写出来的命令最终都会被执⾏,即使分号前⾯的命令出错也不影响后⾯的命令。
[root@xuexi ~]# ls das;echo "hdakl"
ls: cannot access das: No such file or directory
hdakl
2.&&
command1 && command2
逻辑与。&&连接的命令会按照顺序从前向后执⾏,但只有当command1正确执⾏才执⾏command2,如果command1不正确执⾏,则不执⾏command2。在bash中,通过预定义变量“$?”来判断命令是否正确执⾏,如果"$?"的值为0则表⽰前⼀条命令正确执⾏,其他任意值都表⽰不正确执⾏。\
[root@xuexi ~]# echo "hdakl" && ls ds
hdakl
ls: cannot access ds: No such file or directory
[root@xuexi ~]# ls das && echo "hdakl"
ls: cannot access das: No such file or directory
<
command1 || command2
逻辑或。||连接的命令会按照顺序从前向后执⾏,但只有当command1不正确执⾏才执⾏command2,command1正确执⾏则不会执⾏command2。||和&&都是短路符号,符号左右的命令之间具有逻辑关系。
[root@xuexi ~]# ls das || echo "hdakl"
ls: cannot access das: No such file or directory
hdakl
[root@xuexi ~]# echo "hdakl" || ls ds
hdakl
⼀般要联合使⽤&&和||的时候,基本上都会先逻辑与再逻辑或:command1 && command2 || command3。因为在实际
中,command2和command3应该都是想要执⾏的命令。如果command1正确执⾏,$?就等于0,执⾏command2,再看情况执⾏command3,如果command1错误执⾏,$?就不等于0,所以不执⾏command2,根据$?为⾮0值,判断了 || 右边的命令应该被执⾏。
通俗点的理解⽅法是根据语义判断。“如果...就...否则...就...”的语句使⽤“cmd1 && cmd2 || cmd3”,“如果不...就...否则...就...”使⽤“!cmd1 && cmd2 || cmd3”。
例如,如果⽤户user1存在,就显⽰⽤户已经存在,否则,就添加此⽤户。
[root@xuexi tmp]# id user1 && echo "user1 exists" || useradd user1
如果⽤户user2不存在,则添加此⽤户,否则显⽰⽤户已存在。
[root@xuexi tmp]# !id user2 && useradd user2 || echo "user2 exists"
如果⽤户user3不存在,则添加此⽤户,并设定其密码为⽤户名本⾝,否则显⽰⽤户已存在。
[root@xuexi tmp]# !id user3 && useradd user3 && echo "user3" | passwd --stdin user3 || echo "user3 exists"
4.&
command1 &
command1 & command2
&表⽰将其前⾯的命令放⼊后台执⾏,放⼊后台后会⽴即返回到bash环境让⽤户可以继续和bash交互。如果&符号连接了两个
命令,则其前⾯的命令被放⼊后台,⽴即执⾏后⾯的命令,所以可以简单地认为这两个命令是并⾏执
⾏的,两端的命令之间也没有任何逻辑关系。
需要注意的⼀点是,在终端的bash环境下,⼦shell中的后台的进程不受终端控制,在终端被关闭时它会挂靠在init/systemd进程下,因此退出终端或脚本shell环境,⽆法中断这些后台进程。例如:
[root@xuexi ~]# (sleep 10 &) # 终端1上执⾏,⽴即关闭该终端
[root@xuexi ~]# ps aux | grep slee[p] # 终端2上捕捉sleep进程
root 5732 0.0 0.0 107892 624 ? S 00:28 0:00 sleep 10
注意ps结果中的"?",它表⽰⾮终端进程,即脱离了终端。
知识点补充:Shell 命令执⾏顺序
在执⾏某个命令的时候,有时需要依赖于前⼀个命令是否执⾏成功。例如,假设你希望将⼀个⽬录中的⽂件全部拷贝到另外⼀个⽬录中后,然后删除源⽬录中的全部⽂件。在删除之前,你希望能够确信拷贝成功,否则就有可能丢失⽂件
在本⽂中,我们将讨论:
命令执⾏控制。
命令组合。
&&的使⽤:
&&就可以解决上⾯背景说的问题。前⾯指令执⾏成功才执⾏后⾯的指令。
使⽤语法:
命令1&&命令2
相当于逻辑与操作:
condition1 && condition2
只有当condition1为True,才会判断得出condition2
⽰例:
要求:拷贝 /f 到 /etc/f 后把/f删除
cp /f /etc/f&&rm -rf /f
||的使⽤:
||的意思是,当||前⾯的命令执⾏成功就不执⾏||后⾯的命令
使⽤语法:
命令1||命令2
逻辑或的思维。
⽰例:
要求:拷贝 /f 到 /etc/f 否则把/f 拷贝到 /usr/f
cp /f /etc/f||cp /f /usr/f
为了在当前s h e l l中执⾏⼀组命令,可以⽤命令分隔符隔开每⼀个命令,并把所有的命令⽤圆括号()括起来。
语法:
(命令1;命令2;. . .)
⽰例:当失败了,发邮件给⾃⼰然后退出
[root@localhost shell_protest]# cat co.sh
#!/bin/bash
false||echo "it is fail"|mail nick&&exit
#特例:当失败了,发邮件也失败了,就退出不了程序了
false||echo "it is fail"|mail nick||exit
#特例:当失败了,发邮件也成功了,但退出不了程序了
false||(echo "it is fail"|mail nick;exit)
#所以,使⽤()来组合命令,是⼀种不错的选择
shell最简单脚本
总结:
在编写shell脚本时,使⽤&&和||对构造判断语句⾮常有⽤。如果希望在前⼀个命令执⾏失败的情况不执⾏后⾯的命令,那么本⽂所讲述的⽅法⾮常简单有效。使⽤这样的⽅法,可以根据&&或||前⾯命令的返回值来控制其后⾯命令的执⾏。
到此这篇关于Shell脚本中多命令逻辑执⾏顺序的⽅法详解的⽂章就介绍到这了,更多相关shell脚本多命令执⾏顺序内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论