Shell脚本中多命令逻辑执行顺序的方法详解

 更新时间:2020年03月02日 08:28:07   作者:骏马金龙  
Linux中可以使用分号“;”、双and号“&&”和双竖线“||”来连接多个命令,这篇文章主要介绍了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

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脚本时,使用&&和||对构造判断语句非常有用。如果希望在前一个命令执行失败的情况不执行后面的命令,那么本文所讲述的方法非常简单有效。使用这样的方法,可以根据&&或||前面命令的返回值来控制其后面命令的执行。

到此这篇关于Shell脚本中多命令逻辑执行顺序的方法详解的文章就介绍到这了,更多相关shell脚本多命令执行顺序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • hbase-shell批量命令执行脚本的方法

    hbase-shell批量命令执行脚本的方法

    今天小编就为大家分享一篇hbase-shell批量命令执行脚本的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-06-06
  • 使用shell脚本一键部署LNMP架构的方法

    使用shell脚本一键部署LNMP架构的方法

    这篇文章主要介绍了使用shell脚本一键部署LNMP架构的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • shell中exit 0和exit 1的区别有哪些

    shell中exit 0和exit 1的区别有哪些

    exit1和exit是shell中的两个命令,用于退出当前的shell进程,本文就来介绍一下shell中exit 0和exit 1有哪些区别,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • 获取shell脚本自身所在目录的Shell脚本分享

    获取shell脚本自身所在目录的Shell脚本分享

    这篇文章主要介绍了获取shell脚本自身所在目录的Shell脚本分享,本文给出的脚本可以获取软链接所在的目录,需要的朋友可以参考下
    2015-01-01
  • win10下如何运行.sh文件的实现步骤

    win10下如何运行.sh文件的实现步骤

    这篇文章主要介绍了win10下如何运行.sh文件的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Shell日志分析常用命令和例子

    Shell日志分析常用命令和例子

    这篇文章主要介绍了Shell日志分析常用命令和例子,本文重点在一样实现日志分析命令语句例子上,本文给出了10条常用的分析实例,需要的朋友可以参考下
    2014-12-12
  • CentOS 6.x系统升级Python到2.7版本的Shell脚本分享

    CentOS 6.x系统升级Python到2.7版本的Shell脚本分享

    这篇文章主要介绍了CentOS 6.x系统升级Python到2.7版本的Shell脚本分享,本文把升级过程总结成一个自动脚本,需要的朋友可以参考下
    2014-11-11
  • 使用scp获取远程linux服务器上的文件 linux远程拷贝文件

    使用scp获取远程linux服务器上的文件 linux远程拷贝文件

    scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,scp传输是加密的,下面看一下详细使用方法吧
    2014-01-01
  • Linux ps命令详解及Linux查看进程的操作方法

    Linux ps命令详解及Linux查看进程的操作方法

    这篇文章主要介绍了Linux ps命令详解,Linux查看进程的操作方法,ps命令常用的方式有三种,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Linux 命令expect使用详解

    Linux 命令expect使用详解

    expect是由Don Libes基于Tcl语言开发的,是一种脚本语言,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,本文给大家介绍Linux 命令expect使用详解,感兴趣的朋友一起看看吧
    2023-11-11

最新评论