一、Shell 前置知识点介绍1.什么是ShellShell 是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扩展名为 shsh代表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 支持以下三种定义变量的方式variablevaluevariablevaluevariablevalue注意赋值号的周围不能有空格这可能和你熟悉的大部分编程语言都不一样。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 的逻辑运算符字符串运算符文件测试运算符