bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html


Linux中可以使用分号“;”、双and号“&&”和双竖线“||”来连接多个命令。单"&"符号也算命令连接符号,只不过它是将其前面的命令放入后台执行,所以可以变相地实现命令并行执行。

1.分号";"

command1 ; command2

命令之间没有逻辑关系。分号连接的命令会按照顺序从前向后依次执行,但分号两端的命令之间没有任何逻辑关系,所有写出来的命令最终都会被执行,即使分号前面的命令出错也不影响后面的命令。

[root@xuexi ~]# ls das;echo "hdakl"
ls: cannot access das: No such file or directoryhdakl

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结果中的"?",它表示非终端进程,即脱离了终端。

转载于:https://www.cnblogs.com/f-ck-need-u/p/5915106.html

SHELL脚本--多命令逻辑执行顺序相关推荐

  1. [日期工具分享][Shell]为特定命令依次传入顺序日期执行

    [日期工具分享][Shell]为特定命令依次传入顺序日期执行 使用方式: <本脚本文件名(必要时需要全路径)> <要执行的命令所在的文件名> <开始日期> < ...

  2. linux脚本基本命令大全,Shell脚本常用命令

    Shell脚本常用命令 1           Shell中的特殊符号 1.1           $  美元符号.用来表示变量的值.如变量NAME的值为Mike,则使用$NAME就可以得到" ...

  3. linux脚本求命令行上整数和,shell脚本--cut命令与awk简单使用

    cut:对内容进行列切割 -d 后面的是分割符,表示用什么符号来分割符来分割列,分隔符使用引号括起来: -f后面跟着要选择的字段列,从1开始,表示第一列,如果要多列,可以用逗号分隔 : -c参数后面跟 ...

  4. ubuntu及shell脚本常用命令入门

    一.Shell命令 二.ubuntu软件安装方法 三.Ubuntu文件系统结构 四.ubuntu磁盘文件 五.Linux下常用的压缩格式 六.linux用户和用户组 七.Ubuntu/Linux文件权 ...

  5. SqlServer中Sql语句的逻辑执行顺序

    准备数据 Sql脚本如下,两张表,一张客户表Customers只包含customerid和city字段,一张订单表Orders包含orderid和customerid(关联Customers的cust ...

  6. 使用shell脚本或命令行添加、删除 crontab 定时任务

    crontab 是运维过程中常用的定时任务执行工具 一般情况下在有新的定时任务要执行时,使用crontab -e ,将打开一个vi编辑界面,配置好后保存退出,但是在自动化运维的过程中往往需要使用she ...

  7. select语句的逻辑执行顺序,你知道吗?

    回顾一下上一篇博客说到的问题: mysql -uroot -ptest 我们不能赤裸裸的将账户和密码就这样写在你的脚本里,这并不是一个好做法.所有能够访问你脚本的人都会知道数据库的用户账户和密码.要解 ...

  8. Linux战地日记—shell脚本的建立与执行

    shell脚本的建立与执行 第一步:创建文件 通过vi/vim编辑器 第二步:三种执行方式 1.输入定向到shell脚本. $ bash < ex1 2.以脚本名作为bash参数,其一般形式是: ...

  9. linux sh脚本 while,Linux shell脚本使用while循环执行ssh的注意事项

    原标题:Linux shell脚本使用while循环执行ssh的注意事项 如果要使用ssh批量登录到其它系统上操作时,我们会采用循环的方式去处理,那么这里存在一个巨大坑,你必须要小心了. 一.场景还原 ...

  10. python serial 发送ctl+c_[已解决]shell 脚本 给命令发送 Ctrl+C信号

    Signal     Value     Action   Comment ─────────────────────────────────── ────────────────────────── ...

最新文章

  1. Microsoft Remote Desktop移动客户端QA
  2. php 处理ftp常用操作与方法
  3. 中国肠道大会 | 日程及嘉宾(4月16日更新)
  4. PAT甲级1024 Palindromic Number:[C++题解]回文串和高精度加法
  5. 大促密集,CDN如何保障电商体验如丝般顺滑?
  6. mysql 学习笔记 11过程控制
  7. C++语言基础 —— STL —— 容器与迭代器
  8. mysql中文问号 linux,解决Linux系统下Mysql数据库中文显示成问号的问题
  9. 检查oracle用户默认密码的账户
  10. 19 个接私活平台汇总升级版,你有技术就有钱
  11. 【线性代数】P6 矩阵的幂转置特殊矩阵
  12. Oracle 11g安装步骤(超详细)
  13. python实现类似于visio_类似visio的软件有哪些?
  14. 二维数组传参,用int指针接收
  15. win10切换输入法快捷键_改掉Win10难用的输入法
  16. Lesson 11:聚类分析
  17. 浏览器实时查看日志log.io
  18. 一种电源突然掉电的检测方式
  19. Tkinter 布局管理器(一):pack
  20. 计算机双端口实验85H,TEC-8双端口存储器实验.ppt

热门文章

  1. 阿里巴巴最新面试经验
  2. 一文带你彻底理解Linux的各种终端类型及概念
  3. 印度首颗 CPU 横空出世:软件开发已开动
  4. swing怎么监听其他类的按钮_Swing舞出我人生 Vol.05 / 我想通过跳舞去寻找自己
  5. 码了几年代码的程序员,有一定的开发经验,应该如何提升自己?
  6. 《位置计算:无线网络定位》学习小结
  7. oracle 误删除数据,回退表数据
  8. C#----接口的显式实现
  9. JS计算GridView里的TextBox
  10. POJ 1625 Censored!(AC自动机 + DP + 大数 + 拓展ASCII处理)题解