bash 的特性之多命令执行的逻辑关系:
1. 命令替换
COMMAND1 $(COMMAND2)
2. 管道
COMMAND1 | COMMAND2 | COMMAND3 ...
3. 顺序执行结构
COMMAND1 ; COMMAND2 ; COMMAND3 ...
4. 选择执行结构:
如果... 那么...
要么... 要么...
逻辑运算:
与: 逻辑乘法, 1-- 真, 0-- 假,&&, 双目操作符
- 1 && 1 = 1
- 1 && 0 = 0
- 0 && 1 = 0
- 0 && 0 = 0
"与" 运算的短路运算法则: 只要第一个操作数为 false, 则其逻辑运算结果一定为 false;
或: 逻辑加法, 1-- 真, 0-- 假,||, 双目操作符
- 1 || 1 = 1
- 1 || 0 = 1
- 0 || 1 = 1
- 0 || 0 = 0
"或" 运算的短路运算法则: 只要第一个操作数为 true, 则其逻辑运算结果一定为 true;
非: 逻辑取反, 1-- 真, 0-- 假,!, 单目操作符
- !0 = 1
- !1 = 0
命令的执行状态返回值:
- SUCCESS:0--TURE(true)
- FAILURE:1-255--FALSE(false)
- COMMAND1 && COMMAND2
表示:
1. 如果 COMMAND1 能够成功执行, 那么将会执行 COMMAND2;
2. 如果 COMMAND1 执行失败, 那么 COMMAND2 将不会被执行;
COMMAND1 || COMMAND2
表示:
1. 只有 COMMAND1 执行失败, COMMAND2 才会被执行;
2. 如果 COMMAND1 执行成功, 那么 COMMAND2 就不会被执行;
!COMMADN1 && COMMAND2 相当于 COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 相当于 COMMAND1 && COMMAND2
德. 摩根定律
- !(COMMAND1 && COMMAND2) || COMMAND3
- !(COMMAND1 || COMMAND2) && COMMAND3
- !A && B = A || B
- !A || B = A && B
- !(A && B) = !A || !B
- !(A || B) = !A && !B
三种逻辑运算的优先级:
!>&&>||
示例:
如果用户 user4 存在并且其家目录也存在, 那么就执行 userdel -r user4 命令;
id user4 && ls -d /home/user4 && userdel -r user4
bash 脚本编程:
什么叫编程?
使用人类自然语言或机器语言进行程序源代码书写的过程.
为什么要编程?
为了能够让用户在使用计算机的时候, 可以让计算机以非交互的方式完成某些任务; 此时, 用户需要将此类任务编辑称为一个文件, 并且让计算机按照特定书序进行任务读取, 从而实现预期的功能;
为了让计算机能够解读此类文件的内容并正确的予以执行, 必须将程序源代码文件转换为计算机可以直接识别并使用的二进制格式, 此转换过程称为编译; 而想要完成编译过程, 必须使用特定的编译器工具; 因此, 无论使用何种编程语言进行程序编写, 都必须严格按照编译器所能够识别的特定格式和语法结构进行程序编写;
编程语言:
高级语言:
根据源代码的处理方式分类:
编译型语言:
源代码 --> 编译器 (编译) --> [链接器 (链接) --> ] 汇编器 (汇编) --> 可以执行的二进制代码文件;
解释型语言
源代码 --> 解释器 (逐行解释) --> 边解释边执行
根据编程过程中的功能实现是调用库还是调用外部程序文件分类:
完整编程语言:
利用库或编程组件进行编程;
脚本编程语言:
利用解释器调用被选择的外部应用程序;
根据程序的编写规范分类:
过程式语言:
程序 = 指令 + 数据
以指令为中心, 围绕指令的功能实现设计数据和数据结构, 数据为指令服务;
算法和指令的实现形式:
顺序执行
选择执行
循环执行
面向对象语言:
程序 = 算法 + 数据结构
以数据和数据结构为中心, 将数据实例化, 围绕数据的需求来部署算法;
类 (Class): 被实例化的数据;
属性 (attibution): 同一类中的不同对象的区分依据;
方法 (method): 类的正确的操作方法;
低级语言:
汇编语言:
机器语言: 二进制语言
shell 脚本编程 --bash 脚本编程:
过程式编程语言, 解释运行的编程语言, 脚本类语言 (依靠外部应用程序文件运行)
shell 脚本到底是什么?
1. 纯文本文档 -- 文件中所有存储或包含的指令 + 数据都是以字符为单位进行存储的;
2. 根据用户的需求来解决用户问题的简单或复杂的命令组合体;
3. 是一种具有 "执行幂等性" 的程序实体;
执行幂等性: 任何命令的一次执行结果和多次执行结果是一致的;
注意:
很多命令都不具备 "执行幂等性", 因此在 shell 脚本中需要使用大量的程序逻辑来判断某个命令是否符合其运行条件, 从而避免在运行过程中出现的严重错误;
shell 脚本中的代码内容如何书写?
1. 首行必须是 shebang, 即: 解释器程序的绝对路径, 必须占据绝对行首且必须单独占据第一行; 在执行脚本时, 会根据 shebang 的指示, 启动相应的解释器以解释脚本被诸多的命令;
- #!/bin/bash
- #!/bin/sh
- #!/usr/bin/python
- #!/usr/bin/perl
- ...
2. 在 shell 脚本中, 除了 shebang 之外, 所有行首为 #字符的行, 均被解释为注释行; 即: 解释器只会解释其内容, 但并不予以执行;
3. 解释器会忽略脚本文件中所有的空白行; 空白行指的是: 在一行文本中, 除了空白字符, 空格字符, 制表字符之外不具备其他任何类型字符的行;
4. 大量的命令和关键字
命令: 内部或外部应用程序
关键字: 内置于 shell, 只能在某种特定结构体中执行的命令; keyword;
如: if, else, then, do, while, for, select, until, case, fi, esac,...
5.shell 中的所有的特殊功能字符;
注意: 所有被编写进 shell 脚本文档的命令, 关键字及符号必须是 ASCII 编码格式的字符, 其他编码格式的字符可以出现在 shell 脚本文件中, 但不具有任何特殊含义;
如何编写 shell 脚本?
可以利用所有的文本文档编辑工具进行 shell 脚本编写, 如:
nano, vi, vim, pico, emacs, ...
通常在 Linux 的各发行版本中, 推荐使用 vim;
脚本文件的命名方式:
一般情况下, 会为脚本设置 ".sh" 的名称后缀; 较低版本的编辑工具, 会根据文件的后缀名称来识别是否为 shell 脚本文件; 交高版本的文本编辑工具, 如 vim7, 无需过多的关系文件后缀名的问题.
脚本的运行方式:
1. 为脚本文件赋予执行权限, 可以直接以绝对路径或相对路径的方式运行此文件;
- # chmod +x /PATH/TO/SOME_SCRIPT_FILE
- # /PATH/TO/SOME_SCRIPT_FILE
注意: 如果脚本文件所在目录路径存储于 PATH 变量中, 则直接以脚本文件名来执行即可;
2. 直接使用解释器运行脚本, 将脚本文件作为解释器程序的参数;
# bash /PATH/TO/SOME_SCRIPT_FILE
bash 命令的常用选项:
-x: 使 bash 在解释脚本的过程展示在标准输出上; 一般用于为 shell 脚本排错
-n: 对脚本文件进行预执行, 以分析脚本中是否存在语法类错误; 如果没有错误, 则不输出任何信息; 相反, 则输出简洁的提示信息; 具体的错误定位需要自行判断;
注意: 此种方式中, 脚本文件是否有执行权限并不是很重要的属性;
注意: 以上两种方式, 在执行脚本时, 会在当前 shell 中开启一个新的子 shell 以运行脚本; 一般情况下, 当脚本运行结束, 该子 shell 也会被随之销毁; 因此, 所有在脚本中定义的变量, 在脚本的末尾处, 最好将其明确的撤销;
3. 使用 source 命令运行脚本;
- # source /PATH/TO/SOME_SCRIPT_FILE
- # . /PATH/TO/SOME_SCRIPT_FILE
注意:
1.source 命令不会在运行脚本时开启子 shell, 而是在当前 shell 中运行;
2. 使用 source 命令执行的脚本中不要包括诸如 exit 类的命令;
来源: http://www.bubuko.com/infodetail-2645530.html