什么是shell
shell是一个命令解释器,提供用户和机器之间的交互 支持特定语法,比如逻辑判断,循环 还有zsh,ksh等 centos7默认的shell为bash(Bourne Agin Shell) shell是一个用c语言编写的程序语言,它是用户使用linux的桥梁,shell既是一种命令语言,又是一种程序设计语言 shell是一种解释型语言,这种语言经过编写后不经过任何编译就可以执行,是一种脚本语言。和编译型语言是执行前翻译不同,解释型语言的程序是执行时翻译,所以效率差一些
编译型语言和解释型语言
编译型语言
- 优点
编译器一般会有预编译的过程对代码进行优化,因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行 - 缺点
编译之后如果需要修改就需要整个模块重新编译。编译时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件
代表语言:C,C艹,Pascal,Object-C,swift等
解释型语言
- 优点
有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护 - 缺点
每次运行都要解释一遍,性能上不如编译型语言
代表语言:javaScript,Python,Erlang,PHP,Perl,Ruby
编写第一个shell脚本:  运行脚本有两种方法 1)使用bash执行   2)给脚本添加可执行权限,然后直接执行  脚本是各种命令的集合,终究还是要执行服务的 查看命令存储路径 
变量
顾名思义,变量就是其值可以变化的量。从变量本质来说,变量名是指向一片用于存储数据的内存空间。变量有局部变量和环境变量之分。在脚本中往往需要使用变量来存储有用的信息,比如文件名,路径,数值等,通过这些变量可以控制脚本的运行行为
局部变量
是指在某个shell中生效的变量,对其他shell来说这个变量无效,局部变量的作用空间被限制在声明它们的shell里,可以用local内建命令来"显式"的声明局部变量,但仅限于函数内使用
环境变量(全局变量)
在shell脚本里变量默认就是全局的,为了让子shell继承当前shell的变量,可以使用export命令将其定义为环境变量 定义变量:变量名=变量值
设置环境变量的方法
第一种  第二种  变量命名 shell中的变量必须以字母或者下划线开头,后面可以跟数字,字母和下划线,长度没有限制,区分大小写
特殊变量
上边我们说明了局部变量和环境(全局变量)也知道了它们的特点,除了这些还有一些其他的变量,也需要我们注意
只读变量(常量)
只能声明,但不能修改和删除

还可以使用declare -r声明常量 
括号的使用
小括号用法:一次性使用,不会对环境产生影响  大括号用法:前后有空格,这个对全局都有影响 
位置变量
shell中还有一些预先定义的特殊只读变量,它们的值只有在脚本运行时才能确定 $0:代表脚本本身名字 $1------$9:第一个位置参数-------第九个位置参数 $#:脚本参数个数总和 $@:表示脚本的所有参数 $*:表示脚本的所有参数

 那么这个有什么用呢?举个例子: 假如我们要复制一个文件到另一台机器 就可以用脚本来写啦 
$* 和 $@ 的区别
$ *和$ @都代表了脚本的所有参数,但是,$ *会把显示的结果当做一个整体显示,而$ @会把收集到的结果分开显示。不过要注意,如果$ *和$ @有双引号的前提下,显示效果会做区分,如果都没有双引号,效果一样
$0引用名称的使用
$0是脚本名称,那么如果给一个脚本添加一个软连接,这个时候如果再运行脚本,那么它$0显示的名字应该是原来的名字还是更改过后的名字呢  我们以后就可以利用这一点,即便是同一个脚本,到时候也可以扩展出不同的功能,不过也要注意对$0做判断了
shift命令:整体往左位移
默认移动一位,可以通过设置决定移动多少位,在shift后边加上想要移动的位数即可
退出状态
进程使用退出状态来报告成功或者失败 $?变量保存最近命令的退出状态,0代表成功 1-255代表失败 如下:
 我们可以使用$?判断上一条命令是否执行成功,但在脚本里的命令往往是多于一条的 只有一条命令的脚本👇
 如果是有多条命令而且中间还出错了的脚本呢?👇  //发现$?通常情况下之会返回最后一条命令的状态。 但这也不是绝对的,比如语法错误👇 
退出状态码$?也是可以被修改的  
数组
数组是以一种特殊的数据结构,其中每一项被称之为一个元素,对每个元素,都可以用索引的方式取出元素的值。使用数组的典型场景是一次性要记录很多类型相同的数据时(但不一定要必须相同)。比如,为了记录班级中所有人的数学成绩,如果不用数据来处理,那就只能定义所有人成绩的变量。shell中的数组对元素个数没有限制,但只支持一维数组。
1.定义数组
//使用declare命令定义数组  //在创建数组的同时赋值,declare -a也可以省略不写  //也可以用复数,表示倒叙  //还可以指定索引号  注意:多个元素之间不需要用符号分隔,否则会把多个元素当做整体一起输出👇 
2.数组的取值
数组取值格式:${数组名[索引]}
默认显示数字第一个元素值  取出对应索引下标的值  ps:数组内索引为0的才是第一个
3.一次取出数组所有的值
[@]:得到的是以空格隔开的元素  [*] //得到的是一整个字符串

4.数组长度(数组元素个数)
利用“@”或“*”字符,可以将组扩展成列表,然后使用“#”来获取数组元素的个数 
5.数组的截取(分片,切片)
可以截取某个元素的一部分,对象可以是整个数组或某个元素 //定义组  //取出第一个到第三个元素的值  //取出第三个到第六个元素的值  注意:数组分片的书写格式的意义表示:从第几个开始连续出现几个字符 //也可以取出某个元素的第几个开始到第n个字符 
6.连接数组
将若干个数组进行拼接操作  //将两个数组的元素全部连接  //重组新的数组,截取word数组的第二个元素从第0个连续5个字符,和number数组里的第2个字符开始连续3个字符 
7.替换元素
将数组内某个元素的值替换成其他值,如果匹配不到则没有改动  //上边的写法可以达到目的,但较为复杂,其实可以按照变量重新赋值的方式,直接写数组的对应的元素的值。比如,上述例子中将zhangsan改为wangwu就可以简化为如下  //取消数组或元素 使用unset命令,取消数组中的一个元素  //取消整个数组,取消变量全部 
转义和引用
shell中很多特殊字符,会有特殊意义,但是有时候会造成麻烦,需要转义才可以使用,转义符号为“\”  引用是指将字符串用某种符号括起来,以防止特殊字符被解析为其他意思。shell中一共有4中引用符,分别为双引号,单引号,反引号和转义符。双引号可以引用除$符号,反引号,转义符之外的所有字符;单引号可以引用所有字符;反引号将会将反引号中的内容解释为系统命令  
运算符
shell中的运算符主要有比较运算符(用于整数比较),字符串运算符(用于字符串测试),文件操作运算符(用于文件测试),逻辑运算符,算术运算符,位数运算符,自增自减运算符等
1.算术运算符
算术运算符指的是加,减,乘,数,余,幂等常见的算术运算,以及加等,减等,乘等,除等,余等复合算术运算。注意:shell只支持整数计算,也就是说所有可能产生小数的运算都会舍去小数部分  bash shell的算术运算方式有四种 1)使用expr外部程式  注意:4 + 5这三者之间要有空白否则将会出现如下错误  2)使用$(())
 3)使用$[]  4)使用let命令  5)总结 4种写法的算术运算,例子以数字2,3举例  ps:let命令可以直接使用变量名,并且支持变量名和具体数值之间的各种运算
2.与运算,或运算,异或运算
在说这个之前,先来说一下10进制转2进制 将一个十进制数除以二,得到的商再除以二,以此类推直到商等于一或零时为止,倒取除得的余数,即换算为二进制数的结果  二进制转换十进制的原理:从二进制右边第一个数开始,每一个乘以2的n次方,n从0开始,每次递增1,然后得出来的每个数相加即是十进制数  与运算:&(并且)and
- 0 false 假
- 1 true 真
- 0&0=0
- 0&1=0
- 1&0=0
- 1&1=1
或运算:| 或者 or
- 0 | 0=0
- 0 | 1=1
- 1 | 0=1
- 1 | 1=1
XOR运算:^异或
短路与&&逻辑与
- 0&&0=0
- 0&&1=0
- 1&&0=0
- 1&&1=1
如果是命令: cmd1 && cmd2 如果cmd1为假,cmd2不需要执行,反之cmd1为真,则需要执行cmd2。也就是说前面命令执行成功,后面的才会执行
短路或 || 逻辑或
- 0 || 0=0
- 0 || 1=1
- 1 || 0=1
- 1 || 1=1
cmd1 || cmd2 如果cmd1为真,cmd2不需要执行。反之cmd1为假,则需要执行cmd2
3.关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值上数字
- -eq 检测两个数是否相等,相等返回true
[ $a -eq $b ] 返回 false - -ne 检测两个数是否不相等,不相等返回true
[ $a -ne $b ] 返回 true - -gt 检测左边的数是否大于右边的,如果是则返回true
[ $a -gt $b ] 返回true - -lt 检测左边的数是否小于右边的,如果是则返回true
[ $a -lt $b ] 返回true - -ge 检测左边的数是否大于等于右边的,如果是则返回true
[ $a -ge $b ] 返回true - -le 检测左边数是否小于等于右边的,如果是则返回true
[ $a -le $b ] 返回true
eq:equql 平等的,相等的 gt:greater 较大的,大于 lt:less then 小于
|