【Shell编程】基础知识汇总
2026/5/12 14:12:38 网站建设 项目流程

一、Shell 前置知识点介绍

1.什么是Shell

Shell 是Linux系统的命令解释器,是用户和Linux内核之间沟通的桥梁。
我们在终端输入的命令,都会先交给Shell解析,再传给系统内核执行,最后把结果返回给我们,简单理解来说Shell就是Linux的命令行交互环境。

把多条Linux命令按顺序写进一个.sh后缀的文本文件里,批量执行,这个文件就叫Shell脚本。
不用手动一条条敲命令,直接运行脚本就能自动完成一系列操作,常用于自动化运维、批量处理、系统配置。

2.Shell脚本基础语法规则

  • 脚本第一行固定写:#!/bin/bash,指定用bash解释器运行脚本
  • 后缀一般为.sh,例如demo1.sh、hello.sh
  • 脚本默认没有执行权限,需要用chmod +x 脚本名授权
  • 执行脚本:./脚本名
  • 变量:存储数据,如var=$(ps),把命令结果存入变量
  • 命令替换:$(命令),获取命令执行的输出结果
  • 输出打印:echo 内容,在终端展示信息
  • 系统命令:ps查看进程、vim编辑文件等

3.第一个Shell脚本

打开文本编辑器(可以使用 vi/vim 命令来创建文件),新建一个文件 hello.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,输入以下内容:

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell。

echo 命令用于向窗口输出文本。

作为可执行程序 将上面的代码保存为 hallo.sh,并 cd 到相应目录。

第一行是为了让脚本具有执行权限,第二行即执行脚本

注意,一定要写成 ./hello.sh,而不是 hello.sh,运行其它二进制的程序也一样,不写./的话,linux 系统会去 PATH 里寻找有没有叫 hello.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以会找不到命令的,要用 ./hello.sh 告诉系统说,就在当前目录找。

作为解释器参数,这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名。

/bin/sh hello.sh

二、Shell变量

变量是任何一种编程语言都必不可少的组成部分,变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型,直接赋值就可以,Shell 变量也遵循这个规则

在 Bash shell 中,每一个变量的值都是字符串,无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。这意味着,Bash shell 在默认情况下不会区分变量类型,即使你将整数和小数赋值给变量,它们也会被视为字符串。

Shell 支持以下三种定义变量的方式:

  • variable=value
  • variable='value'
  • variable="value"

注意:赋值号=的周围不能有空格,这可能和你熟悉的大部分编程语言都不一样。

Shell 变量的命名规范和大部分编程语言都一样,变量名由数字、字母、下划线组成, 必须以字母或者下划线开头,不能使用 Shell 里的关键字(通过 help 命令可以查看保留关键字)。

使用一个定义过的变量,只要在变量名前面加美元符号$即可。

示例:

变量名外面的花括号{ }是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界

如果不给 author变量加花括号,解释器就会把 $author 当成一个变量(其值为空),代码执行结果就不是我们期望的样子了。

推荐给所有变量加上花括号{ },这是个良好的编程习惯。

示例:

已定义的变量,可以被重新赋值

示例:

注意:对变量赋值时不能在变量名前加$,只有在使用变量时才能加$。

单引号和双引号的区别

以单引号' '包围变量的值时,单引号里面是什么就输出什么,即使内容中有变量和命令(命令需要反引起来)也会把它们原样输出。这种方式比较适合定义显示纯字符串的情况,即不希望解析变量、命令等的场景。

以双引号" "包围变量的值时,输出时会先解析里面的变量和命令,而不是把双引号中的变量名和命令原样输出。这种方式比较适合字符串中附带有变量和命令并且想将其解析后再输出的变量定义。

示例:

注意:什么引号都不加相当于自动用了 “双引号” 的解析功能,但会额外触发 “空格分割” 和 “通配符展开”。

比如:

filename="我的 文件.txt" rm $filename

会被理解成以下情况,系统会以为你要删两个文件.

rm 我的 文件.txt

什么都不加还会触发 * 号通配符,*会变成当前目录所有文件名

echo *

将命令的结果赋值给变量

Shell 也支持将命令的执行结果赋值给变量,常见的有以下两种方式

第一种方式把命令用反引号` `(位于 Esc 键的下方)包围起来,反引号和单引号非常相似,容易产生混淆,所以不推荐使用这种方式

第二种方式把命令用$()包围起来,区分更加明显,所以推荐使用这种方式。

只读变量

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

删除变量

使用 unset 命令可以删除变量。变量被删除后不能再次使用;unset 命令不能删除只读变量。

三、Shell传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,写一个 Shell 脚本,执行脚本时在后面跟多个值,就是给脚本传参数。

示例:

授权运行

传参

下面是一些特殊字符处理参数说明

其中要注意的是:Shell 中 $* 和 $@ 的区别

两者不加双引号时效果几乎一致加双引号 "$*" 和 "$@" 时差异巨大。

不加引号$* 与 $@都会把所有参数按空格分割,遍历所有参数。

加双引号"$*" :把所有参数合并成 1 个完整字符串,参数之间用空格隔开

加双引号"$@" :保留每个参数的独立性,每个参数单独加引号

示例:

四、Shell字符串

字符串(String)就是一系列字符的组合。字符串是 Shell 编程中最常用的数据类型之一(除了数字和字符串,也没有其他类型了) 字符串可以由单引号' '包围,也可以由双引号" "包围,也可以不用引号。它们之间是有区别的。

由单引号' '包围的字符串: 任何字符都会原样输出,在其中使用变量是无效的。 字符串中不能出现单引号,即使对单引号进行转义也不行。

由双引号" "包围的字符串: 如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。 字符串中可以出现双引号,只要它被转义了就行。

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

Shell字符串拼接

在 Shell 中将两个字符串并排放在一起就能实现拼接,非常简单粗暴。

Shell字符串截取

Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取。

1.从指定位置开始截取

从字符串左边开始计数 如果想从字符串的左边开始计数,那么截取字符串的具体格式如下:

从右边开始计数 如果想从字符串的右边开始计数,那么截取字符串的具体格式如下:

注意:从左边开始计数时,起始数字是 0,从右边开始计数时,起始数字是 1。计数方向不同,起始数字也不同。不管从哪边开始计数,截取方向都是从左到右

2.从指定字符开始截取

使用 # 号截取右边字符 使用#号可以截取指定字符(或者子字符串)右边的所有字符,具体格式如下:

从指定字符(子字符串)开始截取,以下写法也可以得到同样的结果:

从指定字符(子字符串)开始截取,最后一个指定字符(子字符串)再匹配结束,那么可以使用##,具体格式为:

从指定字符开始截取,使用 % 截取左边字符 ,使用%号可以截取指定字符(或者子字符串)左边的所有字符,具体格式如下:

字符串操作知识点汇总

五、数组

数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小。

Shell 数组用括号来表示,元素用"空格"符号分割开,通过下表定义数组

读取数组读取数组元素值的一般格式是:

关联数组

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。 关联数组使用 declare 命令来声明,语法格式如下:

-A 选项就是用于声明一个关联数组。关联数组的键是唯一的。

访问关联数组元素可以使用指定的键

获取数组中的所有元素 使用 @ 或 * 可以获取数组中的所有元素,获取数组的长度 获取数组长度的方法与获取字符串长度的方法相同

六、Shell运算符

Shell 和其他编程语言一样,支持多种运算符

例如,两个数相加

expr算术运算符

算术运算符示例:

关系运算符

关系运算符只支持数字,不支持字符串,除非字符串的值是数字。

关系运算符示例

布尔运算符

下表列出了常用的布尔运算符

逻辑运算符

以下介绍 Shell 的逻辑运算符

字符串运算符

文件测试运算符

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询