Shell学习章节目录
Shell入门与Shell变量。
Shell内置命令。
Shell运算符与执行运算命令。
流程控制语句。
Shell函数。
Shell重定向。
Shell好用的工具,cut sed awk sort。
大厂常见企业面试题。
Shell入门:介绍
对于入门,我们需要知道几个概念:
1、Shell是什么
2、Shell脚本是什么
3、为什么要学习Shell脚本,即Shell脚本程序的作用
4、Linux系统默认的Shell解析器
Shell介绍
先来看一个问题:Linux系统是如何操作计算机硬件的?如CPU、内存、磁盘和显示器等?
答案:是通过使用Linux的内核来进行计算机硬件的操作的。
那么要如何才能使用Linux的内核呢?当然就是通过编写Shell命令来调用Linux内核去执行对计算机硬件操作的啦。
所以Shell命令相当于是用户与计算机硬件之间进行交互的桥梁。
基于以上我们可以给出更精简的回答:Shell就是命令,也可以说Shell是一门程序设计语言,因为其内部含有变量、函数与逻辑控制语句等机制。
用一张图来进行解释:
Shell命令或应用程序就是我们写的命令文本或者一个以 .sh 后缀结尾的应用程序,这些内容会被一个Shell解析器给翻译成Linux系统内核所能听得懂的语言然后进行Linux内核的调用。
Shell脚本
Shell脚本就是通过Shell命令或者程序编程语言编写的Shell文本文件,也叫Shell程序。
为什么要学习Shell脚本
我们可以通过Shell命令与编程语言来提高Linux系统的管理工作效率。
Shell的运行过程
当用户下达指令给操作系统的时候,实际上是把指令告诉Shell,经过Shell解释处理后让内核做出相应的动作。系统的回应和输出的信息也由Shell处理,然后显式在用户屏幕上:
Shell解析器
可以通过下面的命令来查看Linux系统所支持的Shell解析器:
简单介绍一下解析器的各自类型:
对于上图中的/bin/bash是被标注了红色的,说明其非常重要,该解析器是所有Linux的发行版本所默认使用的Shell解析器。我们学习也是基于该类型。
使用下面的命令可以查看你当前系统所使用的Shell解析器类型:
# 含义:打印输出当前系统环境所使用的Shell解析器类型
# echo:用于打印输出数据到终端
# $SHELL:是全局共享的读取解析器类型环境变量,全局环境变量是所有的Shell程序都可以读取的变量
echo $SHELL
检查一下:
不难发现默认的就是bash类型。
Shell入门:编写格式与执行方式
这一节主要掌握两个事情:
1、掌握Shell脚本的编写规范
2、掌握执行Shell脚本文件的3种方式与区别
Shell脚本文件编写规范
脚本文件后缀名规范
shell脚本文件就是一个文本文件,后缀名建议以 .sh 结尾。
首行格式规范
在.sh文件的首行需要设置Shell解析器的类型,语法如下:
#!/bin/bash
含义是设置当前Shell脚本文件采用bash解析器运行脚本代码。
注释格式
单行注释,语法如下:
# 注释内容
多行注释,语法如下:
:<<!
asd
asd
asd
!
Shell脚本HelloWorld入门案例
需求:创建一个Shell脚本文件helloworld.sh,输出hello world字符串。
代码如下:
脚本文件的常用执行3种方式介绍
1、sh解析器执行方式
介绍:就是利用sh命令执行脚本文件,本质就是使用Shell解析器运行脚本文件。
语法:sh 脚本文件
执行效果:
除了上面的当前目录的执行形式,也可以写全路径文件的执行形式:
2、bash解析器执行方式
介绍:就是利用bash命令执行脚本文件,本质就是使用Shell解析器运行脚本文件。
语法:bash 脚本文件
执行效果:
bash和sh命令基本没差,同样可以使用全路径的形式,这里不再赘述。
3、仅路径执行方式
介绍:执行当前目录下的脚本文件。
注意:脚本文件自己执行时需要具有可执行权限,否则无法执行。
语法:./脚本文件
执行效果:
添加可执行权限的命令如下:
chmod a+x helloworld.sh
三种脚本文件执行方式的区别
sh或者bash执行脚本文件方式是直接使用Shell解析器运行脚本文件,不需要可执行权限。
而仅路径方式是执行脚本文件自己,需要可执行权限。
Shell入门:多命令处理
掌握Shell脚本文件中执行多命令处理的技术。
多命令处理介绍
就是在Shell脚本文件中编写多个Shell命令。
案例需求
已知目录~/shell_learn,执行batch.sh脚本,实现在该目录下创建一个one.txt,在one.txt文件中增加内容“Hello Shell”。
步骤分析
1、使用mkdir创建~/shell_learn目录
2、创建脚本文件batch.sh
3、编辑脚本文件
3.1、命令1:使用touch命令创建文件,文件名为~/shell_learn/one.txt
3.2、命令2:输出数据“Hello Shell”到one.txt文件中,输出数据到文件中的命令:“数据 >> 文件”
4、执行脚本文件
实现
执行效果如下:
Shell变量:环境变量
两个目标:
1、理解什么是系统环境变量
2、掌握常用的系统环境变量都有哪些
Shell变量的介绍
变量用于存储管理临时的数据,这些数据都是运行在内存中的。
变量类型的介绍
主要是下面三类:
1、系统环境变量
2、自定义变量
3、特殊符号变量
1、系统环境变量
系统环境变量是系统提供的共享变量,是Linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用。
Shell的配置文件分类:
1、全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2、个人配置文件
当前用户:/.bash_profile
当前用户:/.bashrc
一般情况下,我们都是直接针对全局配置进行操作。
环境变量分类
在Linux系统中,环境变量按照其作用范围不同大致可以分为系统级环境变量和用户级环境变量。
系统级环境变量:
Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用。
用户级环境变量:
Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用,登录用户使用。
查看当前Shell系统环境变量
查看命令:
env
效果如下:
查看Shell变量(系统环境变量+自定义变量+函数)
查看命令:
set
效果如下:
常用系统环境变量
环境变量输出演示,就演示几个重要的,其它都差不多:
Shell变量:自定义变量
本节目标两个:
1、理解自定义变量的分类
2、能够自定义变量进行CRUD
自定义变量介绍
就是自己定义的变量。
分类
1、自定义局部变量
2、自定义常量
3、自定义全局变量
自定义局部变量
就是定义在一个脚本文件中的变量,只能在这个脚本文件中使用的变量,就是局部变量。
定义语法如下:
var_name=value
变量定义规则:
1、变量名可以由字母数字下划线组成,但不能以数字开头
2、等号两侧不能有空格
3、在bash环境中,变量的默认类型都是字符串类型,无法直接进行数值运算
4、变量的值如果有空格,必须使用双引号括起来
5、不能使用Shell的关键字作为变量名称
在命令行中定义变量:
查询变量值语法如下:
# 语法1:直接使用变量名查询
$var_name
# 语法2:使用花括号
${var_name}
两种方式区别:花括号方式更适合拼接字符串,马上会演示一下为什么这么说。
在命令行中查询我们刚刚定义的变量值:
那么为什么花括号方式更适合拼接字符串呢,举个例子:
可以看见当我们在变量后面想拼接一些字符串的时候,Shell将不再认识我们的变量,而使用大括号则不会有这种问题:
上面的增加和查询都说了,那么修改呢?其实修改就是对一个变量重新进行赋值即可,举个例子,修改刚刚定义的name:
这就进行了修改,还剩一个删除命令,删除命令语法定义如下:
unset var_name
演示删除我们刚刚的name变量:
自定义常量
常量其实就是一个变量设置值了之后不可以进行修改的变量叫常量,也就是只读变量。
语法定义如下:
readonly var_name
演示如下:
可以看见无法对name变量进行修改。
自定义全局变量
父子Shell环境介绍
假如有两个Shell脚本文件 A.sh 和 B.sh ,在 A.sh 脚本文件中执行了 B.sh 脚本文件,那么 A.sh 就是父Shell环境,而 B.sh 就是子Shell环境。
自定义全局变量介绍
就是在当前脚本文件中定义全局变量,这个全局变量可以在当前Shell环境与Shell子环境中都可以使用。
自定义全局变量语法
语法定义如下:
export var_name1 var_name2 var_name3=hahah...
案例需求
测试全局变量在子Shell中是否可用,在父Shell中是否可用。
案例演示
1、创建demo2.sh 和 demo3.sh文件
2、编辑demo2.sh:
3、编辑demo3.sh
4、执行demo2.sh发现demo3.sh读取不到var_1变量:
因此我们使用上述说的自定义全局变量的方法来进行验证,修改一下demo2.sh:
测试发现完全正确:
注意此时这个变量只能在demo2.sh和demo3.sh中使用,其它位置都是使用不了的:
Shell变量:特殊符号变量
了解常用的特殊变量有哪些。
特殊变量:$n(n表示一个数字)
语法:
$n
含义:用于接收脚本文件执行时传入的参数。
$0 是用于获取当前脚本文件名称的
$1~$9,代表获取第一个输入参数到第九个输入参数第十个参数以上的格式:${数字},否则无法获取
执行脚本文件传入参数的语法如下:
sh 脚本文件 输入参数1 输入参数2 ...
案例需求
创建脚本文件demo4.sh,并在脚本文件内部打印脚本文件名字,第一个输入参,第二个输入参数。
案例实现
执行效果如下:
特殊变量:$#
语法定义如下:
$#
含义:获取所有输入参数的个数。
案例需求
在demo4.sh中输出输入参数的个数
案例实现
实现效果如下:
特殊变量:$* 、$@
语法定义如下:
$*
$@
# 含义都是获取所有输入参数,用于以后输出所有参数
$*与$@的区别:
1、不使用双引号括起来,二者功能一样
$*和$@都是获取所有输入参数,格式为:$1 $2 … $n2、使用双引号括起来
“$*” 获取的所有参数拼接为一个字符串,格式为:“$1 $2 … $n”“$@” 获取一组参数列表对象,格式为:“$1” “$2” “$3” … “$n”
我们可以使用循环打印所有输入参数可以看出区别。
循环语法先提前说一下:
for var in 列表变量
do # 循环开始命令 # 循环体
done # 循环结束
案例需求
在demo4.sh中循环打印输出所有输入参数,体验$*和$@的区别。
案例实现
运行效果如下:
可以看见二者不带双引号时输出是一样的,就是所有的输入参数组成的列表;而带双引号的$*循环输出时依然是直接输出一个参数字符串列表,只循环一次。而带双引号的$@则是一个一个参数的打印输出,循环了不止一次。
特殊符号变量:$?
语法定义如下:
$?
含义:用于获取上一个Shell命令的退出状态码,或者是函数的返回值。
每个Shell命令的执行都会有一个返回值,这个返回值用于说明命令是否执行成功。
一般来说,返回 0 代表命令执行成功,非 0 代表执行失败。
简单演示一下:
特殊符号变量:$$
语法定义如下:
$$
含义:用于获取当前 Shell 环境的进程 ID 号。(因为每个Shell脚本文件的执行都会启动一个进程)
简单演示一下:
对于上面 ps -aux | grep bash 这条命令的解释:
这条命令 ps -aux | grep bash 在Unix或Linux系统中用于查找与bash相关的进程。这里涉及了两个主要部分:ps -aux 和 grep bash,以及它们之间的管道符 |。
ps -aux:
ps 是一个显示系统中当前运行的进程的命令。
-a 选项表示显示所有终端下的进程,不仅仅是当前终端的。
-u 选项表示显示用户/拥有者信息。
-x 选项表示显示没有控制终端的进程。
综合起来,ps -aux 会列出系统上所有用户的所有进程,并显示它们的详细信息,包括用户、PID(进程ID)、CPU使用率、内存使用率、启动时间、TTY(控制终端)、进程状态以及命令行。
|:
这是一个管道符,用于将一个命令的输出作为另一个命令的输入。在这里,ps -aux 的输出被传递给 grep bash。
grep bash:
grep 是一个用于文本搜索的命令,它会搜索指定的模式(这里是“bash”)并在输入中查找匹配的行。
因此,grep bash 会从输入中筛选出所有包含“bash”的行。
综合起来,ps -aux | grep bash 命令会列出所有包含“bash”的进程。这通常用于查找bash shell的实例,以便了解哪些用户正在使用bash,或者查看bash进程的状态等。
注意:由于 grep bash 本身也会作为一个进程运行,因此这条命令的输出中通常会包含一行与 grep bash 相关的进程信息。如果你只想看到其他bash进程,可以使用 ps -aux | grep bash | grep -v grep,这样 grep -v grep 会从输出中排除包含“grep”的行。
Shell环境变量深入:自定义系统环境变量
目标是能够自定义系统级环境变量。
全局配置文件/etc/profile应用场景
当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量,供给所有Shell程序使用。
以后只要是所有Shell程序或者命令使用的变量,就可以定义在这个文件中。
案例演示
需求
/etc/profile定义存储自定义系统级环境变量数据。
创建环境变量步骤
1、编辑/etc/profile全局配置文件
# 增加命令:定义变量VAR1=VAR1 并导出为全局变量
#(因为是在profile文件中定义的全局变量,所以所有Shell程序都可以使用该变量,该变量同时也是环境变量)
2、重载配置文件/etc/profile,因为配置文件修改后要立刻加载里面的数据所以需要重载,语法:
source /etc/profile
3、在Shell环境中读取系统级环境变量VAR1
创建环境变量演示
注意,一般情况下,我们进入profile文件后光标默认在顶端,但我们如果要添加自己的环境变量的话一般是追加在底端,所以使用VIM的G快捷命令来到profile文件的底端进行操作(小写的gg则可以返回顶端):
记得source一下:
现在我们就可以读到该变量名了:
Shell环境变量深入:加载流程原理介绍
目标两个:
1、明白交互式Shell与非交互式Shell
2、明白登录Shell环境与非登录Shell环境
Shell工作环境介绍
用户进入Linux系统就会初始化Shell环境,这个环境会加载全局配置文件和用户个人配置文件中的环境变量。
同时进入系统后还会执行一些脚本文件,而每个脚本文件都会有自己的Shell环境。
Shell工作环境分类
交互式Shell
与用户进行交互,互动。效果就是用户输入一个命令,Shell环境立刻反馈响应一个命令(给一个命令显示一个结果)。
非交互式Shell
不需要用户参与就可以执行多个命令的形式,比如一个脚本文件含有多个命令,直接执行并给出结果。
登录Shell环境与非登录Shell环境
注意:不同的工作环境加载环境变量流程不一样。
环境变量加载初始化过程:
补充:切换Shell环境执行脚本文件介绍
在执行一个脚本文件时可以指定具体Shell环境进行执行脚本文件,这个就是切换Shell环境执行脚本。
Shell登录环境执行脚本文件语法
sh/bash -l/--login 脚本文件
注意上面的斜杠意思是或的意思,并非是命令的一部分。
含义:先加载Shell登录环境流程初始化环境变量,再执行脚本文件。
Shell非登录环境变量执行脚本文件语法
bash # 加载Shell非登录环境
sh/bash 脚本文件 # 直接执行脚本文件
注意上面的斜杠意思是或的意思,并非是命令的一部分。
含义:先执行加载Shell非登录环境流程初始化环境变量,再执行脚本文件。
Shell环境变量深入:识别Shell环境类型
目标是理解如何识别Shell登录环境与非登录环境。
语法
使用 $0 识别环境语法:
echo $0
输出 -bash 代表:Shell登录环境
输出 bash 代表:Shell非登录环境
注意:这个 $0 环境变量如果用在子Shell中(也就是Shell脚本文件)输出Shell脚本本身的文件名
bash 命令语法:
bash
bash命令:用于切换为Shell非登录环境
演示
上图的情况是因为我一开始使用用户名与密码登录的ubuntu,然后在ubuntu用户的Shell窗口中切换到了root用户,因此在root用户的Shell窗口中使用$0查询得到的是bash非登录环境,而exit出去回到ubuntu用户中再查询时就是-bash即登录环境了。
Shell环境变量深入:详细切换Shell环境
理解切换Shell环境的命令。
切换Shell环境命令介绍
1、直接登录加载Shell登录环境
2、su切换用户加载Shell登录与Shell非登录环境
3、bash加载Shell登录与Shell非登录环境
切换Shell环境命令演示
切换环境方式1:直接登录系统
就是直接在虚拟机上使用用户名与密码登录Linux系统或使用客户端直接连接远程Linux系统。
切换环境方式2:su切换用户登录
使用命令:
命令1:
su 用户名 --login
或者
su 用户名 -l
# 切换到指定用户,加载Shell登录环境变量
命令2:
su 用户名
# 切换到指定用户,加载Shell非登录环境变量
切换环境方式3:bash切换
命令1:
bash # 加载【Shell非登录环境】
命令2:
bash -l shell脚本文件 / bash --login shell脚本文件
sh -l shell脚本文件 / sh --login shell脚本文件
# 先加载【shell登录环境】然后运行指定Shell脚本文件