您好,登录后才能下订单哦!
本篇文章给大家分享的是有关Shell脚本中多命令逻辑的执行顺序是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
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
3.||
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
示例:
要求:拷贝 /tmp/nginx.conf 到 /etc/nginx/nginx.conf 后把/tmp/nginx.conf删除
cp /tmp/nginx.conf /etc/nginx/nginx.conf&&rm -rf /tmp/nginx.conf
||的使用:
||的意思是,当||前面的命令执行成功就不执行||后面的命令
使用语法:
命令1||命令2
逻辑或的思维。
示例:
要求:拷贝 /tmp/nginx.conf 到 /etc/nginx/nginx.conf 否则把/tmp/nginx.conf 拷贝到 /usr/nginx/nginx.conf
cp /tmp/nginx.conf /etc/nginx/nginx.conf||cp /tmp/nginx.conf /usr/nginx/nginx.conf
为了在当前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脚本中多命令逻辑的执行顺序是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。