一、shell的基础
1、 什么是shell?
shell脚本不同于其他,shell是一种命令的解释器,它在操作的最外层,主要负责的是直接与用户进行对话,把用户输入的命令解释给操作系统,并处理各种各样的操作系统的输出结果,输出结果会显示在屏幕前面给用户,这种对话方式是交互也可以是非交互的形式
说明:
交互就是在终端上执行命令,而非交互就是相反的就比如我们写的脚本中的命令,那这个脚本中的命令执行是有shell自己进行足行处理的,作用也可以查看下图:
解释说明:
我们输入的命令计算机是不识别的,这时候就需要一个翻译官进行翻译,而这shell就相当于这个翻译官
常用的shell解释器有很多种可以通过/etc/shells文件可以知道当前系统所支持的shell种类。其中/bin/bash是目前大多数linux版本采用的默认shell。
2、什么是shell脚本
shell脚本就是将要执行的命令按照顺序的保存到一个文本中,并给该文件一个可执行的权限在由shell去执行这个文件。可结合各种shell控制语句完成跟复杂的操作,常用语重复性操作、批量操作、自动化运维、定时任务执行等。
2.1 比如下面的简单案例:
编写好后在有sh或bash 文件名进行执行
2.2 可以执行多个命令如下
这里大家是不是有点好奇问什么第一行要有#/bin/bash这样的注释,这里的注释是告诉文件此文件编写的是shell脚本,提到一个解释说明的作用
看到这里也说明一下,基本上大多数的语言中#表示注释的意思,编译器不会执行此行命令
多行注释可以使用 :+'注释的内容' 即就是:: + 空格 + 单引号 还有很多种,我感觉这个好用一些,不同语言这个多行注释方法是不一样的
: '
hostname
'
还用一种执行方式,直接执行但需要这个文件有可执行的权限如下:
还可以用source来执行但是这个执行的时候,他会产生一个子shell终端来执行的文件中的命令也就是当前这个终端是不生效的不建议使用
总结:我们可以将一些在终端需要一个一个执行的命令放到文件中在由shell来进行执行,这需要我们对shell中一些常用的命令较为熟练才可以
尤其是awk、sed、grep等这些命令,还需要知道会用正则表达式
二、shell中常用命令的使用介绍
1、管道符| 、重定向符(< 、> 、<< 、>>) 、|| 、&&、常见符文的介绍
管道符就是将前面执行后的结果拿出来在进行处理通常与其他的命令集合使用
例如:只查看挂载信息的前两行
(< 、> 、<< 、>>)
<:输入重定向 (会覆盖原文件内容,谨慎使用)
>:输出重定向,使用较多(会覆盖原文件内容,谨慎使用)
<<: 追加输入重定向 (不会覆盖原文件,只会在原文件最后面加入重定向的内容)
>>:追加输出重定向,使用较多(不会覆盖原文件,只会在原文件最后面加入重定向的内容)
|| 、 &&
||:表示前面的命令执行失败后执行后面的命令、&&表示前面的命令执行成功后才执行后面的命令
二、变量的介绍与使用
一、介绍
1、什么是变量
变量是shell传递的数据的一种方法,变量是用来代表每个值的符号名,我们也可以将变量当成一个容器,脚本可以在内存中存储数据,然后通过变量,就可以在脚本进行中修改和访问存储的数据
2、变量的设置规则:
- 2.1 变量名称通常使用大些字母,他可以由数字、字母(大小写)、和下划线_等组成,变量名区分大小写;但是要注意不能以数字开头
- 2.2 变量=用于为变量分配值,在使用过程中等号两边不能为空
- 2.3 变量存储的数据类型是整数或者字符串值
- 2.4 在对变量赋予字符串时,建议大家用引号将其括起来,需要使用单引号或者双引号
- 2.5 要对变量进行调用,可以在变量名称前加美元符号$
- 2.6 如果需要增加变量的值,那么可以进行变量值的叠加,不过变量需要用双引号包含"$变量名"或者用$(变量名)
二、变量的分类介绍
- 用户自定义变量、上面测试的例子就是自定义变量
- 环境变量:这种变量中主要保存的是和系统操作环境相关的数据,例如PATH环境变量
- 位置变量:这种变量主要是用来向脚本当中传递参数或者数据的,变量名不能自定义,变量作用是固定的
- 预定义变量:是Bash中已经定义好的变量,变量名不能自定义修改,变量作用也是固定的
三、使用
1、 自定义变量的使用
- 1.1 变量的定义规范
- 1.2 叠加输出
如果想让字符串直接拼接在一起就要用到${变量名}
- 1.3 将之前的命令输出结合使用,如何我们查看/的挂载使用情况
或者
、
`命令语句`与$(命令语句)是一样的都是表示先执行这里面的命令
- 1.4 变量用于运算
$(( ))与$[ ]是一样的都可以用来运算使用、 +(加)、—(减)、*(乘) 、 /(除) 、 %(取余)
- 1.5 单引号与双引号的区别
说明:双引号中会执行变量的值,但是单引号不会关这些,单引号里面是什么输出就是什么,可以理解为单引号就是直男看不懂这些也不想看懂这些符文的含义😝
2、环境变量
在shell中,环境变量又分为全局变量与局部变量
全局的变量适用于这个环境中的说有用户以及子shell终端
局部变量适用于某个用户可以使用,或者当前中端可以使用
centos正常查看环境变量是env或printenv命令查看变量
从这也能看到我们使用的/bin/bash就是shell的变量
我们可以使用export这个命令将局部变量临时的加入为全局变量
可以看到我们换个子终端就无法使用这个变量了,下面使用export来看看
同样我们在env也可以看见了
所以我们写脚本的时候如果让自己定义的变量可以在每个终端中使用,那脚本中定义变量的时候就要写export
也可以人这个变量永久的生效可以写入配置文件中: /etc/profile 这个文件中保存这我们系统中的所有永久的变量信息
写完后在是有source /etc/profile刷新一下这个文件
其他常用的环境变量:
环境变量USER表示当前登录系统的用户名称
环境变量HOME表示用户的宿主目录
环境变量LANG表示语言和字符集
环境变量PWD表示当前所在的工作目录。
3、删除变量的值,unset
用法: unset 变量名
4、位置变量
位置变量用于脚本中的一般都是$0--$n
$0:表示脚本文件名 $1:表示脚本文件名后的第一个参数,。。。。后面的以此类推 $n第n个参数
5、特殊定义变量
即,shell一开始就自己定义好的变量值,这个无法更改
$* : 表示所有位置上的参数内容就是将所有的位置参数当做一个整体
$# : 表示位置参数的个数,就是传递脚本的参数个数
$@ :也表示位置参数与$*类似,但是它是将每个位置上的参数当做个体
$$ :当前进程的PID
$! :后台运行的最后一个的进程PID
$? : 返回上一个命令的结果,0表示上一条命令执行成功,非0表示执行失败
5、运算命令expr
可以看到 / 除的时候只显示整数部分,判断中返回1的时候为真,返回0的时候为假
字符串的取值
length统计一共的字符串的长度,substr截取 第一个表示从哪开始,第二表示从哪开始向后截取几个,空格也算
常用的算数运算符
运算符 | 意义 |
++ -- | 递增及递减,可前置也可以后置。如a++、++a |
+ - * / % | 加减乘除与余数 |
< <= > >= | 比较大小符号 |
== != | 相等 不相等 |
&& ||! | 逻辑与 ,逻辑或,逻辑否 |
? : | 条件判断 |
= += -= *= /= %= | 赋值运算符,a+=1相当于a=a+1 |
说明:
a++是先读取a的值在加1 ++a是先加1在读取a的值