Shell脚本学习(一):Shell入门与Shell变量

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 … $n

2、使用双引号括起来
“$*” 获取的所有参数拼接为一个字符串,格式为:“$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脚本文件

Shell字符串变量:格式介绍

理解使用字符串的3种方式
掌握3种方式的区别。
能够获取字符串的长度。

字符串是Shell编程中最常用的数据类型之一(除了数字和字符串,也没有其它类型了)。

字符串的3种格式

1、单引号格式
2、双引号格式,推荐
3、不用引号格式

演示如下:
在这里插入图片描述

字符串的3种方式区别

1、使用单引号的字符串:
任何字符都会原样输出,在拼接字符串中使用变量是无效的。

演示:
在这里插入图片描述

2、由双引号包围的字符串:
其中包含了变量,那么该变量会被解析得到值,而不是原样输出。
字符串中还可以出现双引号的子字符串,但是需要转义。

演示:

在这里插入图片描述

在这里插入图片描述

3、不被引号包围的字符串:
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号包围的字符串一样。
但是字符串中不能出现空格,否则空格后边的字符串会作为其它命令被解析。

在这里插入图片描述

在这里插入图片描述

获取字符串的长度

语法定义如下:

${#字符串变量名}

含义:获取字符串的字符个数,即字符串长度。

演示如下:

在这里插入图片描述

Shell字符串变量:拼接

掌握Shell字符串拼接。

字符串拼接方式

1、无符号拼接
2、双引号拼接,推荐
3、混合拼接

无符号拼接演示如下:

在这里插入图片描述

双引号拼接演示如下:

在这里插入图片描述

混合拼接演示如下:
在这里插入图片描述
在这里插入图片描述

Shell字符串变量:字符串截取

掌握Shell字符串截取的常用格式。

语法

在这里插入图片描述

截取示例

要求如下:

在这里插入图片描述

效果如下:

在这里插入图片描述

Shell索引数组变量:定义-获取-拼接-删除

能够定义数组。
能够获取Shell数组数据。
能够进行Shell数组的拼接,删除。

介绍

Shell支持数组(Array),数组是若干数据的集合,其中的每一份数据都称为数组的元素。

注意:Bash Shell只支持一维数组,不支持多维数组。

数组的定义

语法如下:
在Shell中,用括号()来表示数组,数组元素之间用空格来分隔,语法为:

array_name=(item1 item2 ...) #方式1
array_name=([索引下标1]=item1 [索引下标2]=item2 ...) #方式2

注意:赋值号=两边不能有空格。

演示如下:

1、定义数字存储:100 ,3, 22, 58, 77, 17, 20
2、Shell是弱类型的,并不要求所有数组元素的类型必须相同
3、Shell数组元素定义后不是固定的,定义后还可以赋值
4、可以给指定元素赋值初始化
在这里插入图片描述

数组的获取

语法如下:

1、通过下标获取元素值,index从0开始

${arr[index]}

注意使用{ }

2、获取值同时复制给其他变量

item=${arr[index]}

3、使用@或者*可以获取数组中的所有元素

${arr[@]}
${arr[*]}

4、获取数组的长度或者个数

${#arr[@]}
${#arr[*]}

5、获取数组指定元素的字符长度

${#arr[index]}

演示如下:

在这里插入图片描述

数组的拼接

所谓Shell的数组拼接(数组合并),就是将两个数组连接成一个数组。

语法

使用@和*获取数组所有元素之后进行拼接:

array_new=(${array1[@] ${array2[@]} ...)
array_new=(${array1[*] ${array2[*]} ...)

演示

在这里插入图片描述

数组的删除

删除数组指定元素数据和删除整个数组数据。

语法

删除数组指定元素数据:

unset array_name[index]

删除整个数组:

unset array_name

演示

在这里插入图片描述

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

在地球迷路的怪兽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值