说到编程,我们大家都不会陌生,但是在Linux中,我们主要做的是脚本的编写。当然了,想要了解Linux的脚本编写,我们得先来说说多命令执行的逻辑关系。
1.命令替换
COMMAND1 $(COMMAND2)
2.管道
COMMAND1 | COMMAND2 |...
3.顺序执行结构
COMMAND1 ; COMMAND2 ;COMMAND3 ;....
4.选择执行结构:
如果...那么...
要么...要么...
主要的就是逻辑运算结构,我们大家所知的逻辑运算就是与或非,所以就从这三点来 说。
1)与:逻辑乘法,1--真,0--假,bash中,&&,双目操作符
1 && 1=1
1 && 0=0
0 && 1=0
0 && 0=0
"与"运算的短路运算法则:只要第一个操作数为flase;则其逻辑运算结果一定为 false;
2)或:逻辑加法,1--真,0--假,bash中,||,双目操作符
1 || 1=1
1 || 0=1
0 || 1=1
0 || 0=0
"或"运算短路法则:只要第一个操作数为ture,则其逻辑运算结果一定为ture;
3)非:逻辑取反,1--真,0--假,!,单目操作符;
!0=1
!1=0
命令的执行状态返回值:
SUCCESS: 0--TURE
FAILURE: 1-255--FALSE
当然,在Linux中我们主要通过命令行输入命令来对Linux系统进行操作的,所以,我 们主要是针对命令来实行与或非的逻辑运算。
与:COMMAND1 && COMMAND2
表示:
1.如果COMMADN1能够成功执行,那么将会执行COMMAND2;
2.如果COMMADN1执行失败,那么COMMAND2不会被执行;
或:COMMAND1 || COMMAND2
表示:
1.只有COMMAND1执行失败,COMMAND2才会被执行;
2.如果COMMADN1执行成功,那么COMMAND2就不会被执行;
非:(一般与与或混合使用)
!COMMAND1 && COMMAND2 相当于 COMMAND1 || COMMAND2
!COMMAND1 || COMMAND2 相当于 COMMAND1 && COMMAND2
三种逻辑运算的优先级:
! > && > ||
示例:
如果用户user4存在并且其家目录也存在,那么就执行userdel -r USer4命令;
id user4 && ls -d /home/user4 && userdel -r USer4
简单介绍一下多命令执行的逻辑关系,我们来说说bash脚本编程。
什么叫编程?
使用人类自然语言或机器语言进行程序源代码书写的过程。
为什么要编程?
为了能够让用户在使用计算机的时候,可以让计算机以非交互的方式完成某些任务;此时用户需要将此类任务编辑成为一个文件,并且让计算机按照特定的顺序进行任务读取,从而实现预期的功能;
为了让计算机能够解读此类文件的内容并正确的予以执行,必须将程序源代码文件转换为计算机可以直接识别并使用的二进制格式,此转换过程称为编译;而想要完成编译过程,必须使用特定的编译器工具;因此无论使用何种编程语言进行程序编写,都必须按照编译器所能够识别的特定格式和语法结构进行程序编写;
我们至今所了解到的编程语言有:高级语言,低级语言以及机器语言。其中高级语言分居不同的方式有不同的分类:
1、根据源代码的处理方式分类:
1)编译性语言,主要过程:
源代码 --> 编译器处理(编译) --> [链接器(链接)] --> 汇编器(汇编) --> 可执行的二进制代码文件;
2)解释性语言
源代码 --> 解释器(逐行解释) --> 边解释边执行。
2、根据在编程过程中的功能实现是调用库还是调用外部程序文件来分类:
完整的编程语言:
利用库或编程组件进行编程;
脚本编程语言:
利用解释器调用被选择的外部应用程序;
3、根据程序的编写规范分类:
过程式语言:
程序 = 指令+数据
以指令为中心,围绕着指令的功能实现设计数据和数据结构,数据为指令服务;
算法和指令的实现形式:
顺序执行
选择执行
循环执行
面向对象语言:
程序 = 算法+数据结构
以数据和数据结构为中心,将数据实例化,围绕数据的需求部署算法;
类(class):被实例化的数据;
属性(atribution):同一类中的不同对象的区分依据;
方法(mathod):类的正确的操作方法;
低级语言主要是汇编语言,机器语言主要是二进制语言。而bash脚本编程语言是不同于这些编程语言的,它是一种过程式编程语言,解释运行的编程语言,脚本类语言(依靠外部应用程序文件运行)。说了这么多,那bash脚本到底是什么呢?他到底如何编写?它的代码书写格式到底与我们平常所使用的编程语言有什么区别呢?接下来我们就来讲一讲。
一、bash脚本到底什么?
1.纯文本文档——文件中所有存储或包含的数据指令+数据都是以字符为单位进行存储的;
2.根据用户的需求来解决用户问题的简单或复杂的命令组合体;
3.是一种具有"执行幂等性"的程序实体;
执行幂等性:任何命令的一次执行结果和多次执行结果是一致的;
注意:很多的命令都不具备"执行幂等性",因此在shell脚本中需要使用大量的程序逻辑来判断某个命令是否符合其运行条件,从而避免在运行过程中出现的严重错误。
二、Shell脚本中的内容如何书写?
1.首行必须是shebang,即:解释器程序的绝对路径,必须占据绝对行首且必须单独占据第一行;在执行脚本时,会根据shebang的指示,启动相应的解释器以解释脚本被诸多的命令;
#!/bin/bash
2.在shell脚本中,除了shebang之外,所有行首为#字符的行,均被解释为注释行;即:解释器只会解释其内容,但并不予以执行;
3.解释器会忽略脚本文件中所有的空白行;空白行指的是:在一行文本中,除了空白字符,空格字符,制表字符不具备其他任何类型字符的行;
4.大量的命令和关键字
命令:内部或外部应用程序;
关键字:内置于shell,只能在某种特定结构体中执行的命令;keyword;
如:if,else,then,do,while,for,select,until,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也会被随之销毁;因此,所有在脚本中定义的变量,在 脚本的末尾处,最好将其明确的撤销;unset撤销变量。gc垃圾收集。
3.使用source命令来运行脚本:
# source /PATH/TO/SOME_SCRIPT_FILE
# . /PATH/TO/OME_SCRIPT_FILE
注意:
1.source命令不会再运行脚本时开启子shell,而是在当前shell中运行;
2.使用source命令执行的脚本中不要包括诸如exit类的命令;(很可能将当前shell注 销,你设置的属性等还得重新设置等)
写一个脚本:
当alex用户不存在时,创建之;如果成功创建,则显示成功创建的提示信息,否则显示用户已存在。
[root@localhost ~]# vim a.sh #!/bin/bash # ! id alex && useradd alex && echo "User alex is here" || echo "alex is already." [root@localhost ~]# bash a.sh id: alex: no such user User alex is here
我们可以利用bash脚本程序实现算数运算:
算数运算操作符:
常用的基本算数运算符:
+,-,*,/,%,**
增强型的算数运算符:
+=,-=,*=,/=,%=
特殊的增强型算数运算符:
++,--
算术运算方法:
1.$[exipression]
其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;使用变量时,可以 将'$'符号省略;
示例:
# echo $[3+4]
# Num1=5;num2=4;echo $[Num1+num2]
2.let VAR=EXPRESSION
根据算数表达式完成算数运算并赋值给指定的变量;
3.$((EXPRESSION))
其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;使用变量时,可以 将'$'符号省略;
4.expr ARGUMENT1 ARGUMENT2 ARGUMENT3
其中ARGU1和ARGU3必须是整数数值;ARGU2是算数运算符;
5.echo "EXPRESSION" | bc
[root@localhost ~]# echo "scale=3;35/7" | bc 5.000
6.bc <<< "EXPRESSION"
[root@localhost ~]# bc <<< "scale=5;40/7" |bc 5.71428
例如:
[root@localhost ~]# vim a.sh #!/bin/bash # num1="`ls /etc | wc -l`" num2="`ls /var | wc -l`" num3="`ls /usr | wc -l`" let sum=$num1+$num2+$num3 echo "$sum" [root@localhost ~]# bash a.sh 310