目录
一、什么是shell脚本
二、有哪些表达式
一、变量
二、运算符
三、语句类型分哪几种
一、条件语句
二、分支语句
三、循环语句
四、函数
五、正则表达式
一、标准正则
二、扩展正则
六、文件操作四剑客
七、shell
一、shell是一种命令解释器
二、查看系统中支持的shell
三、查看系统默认的shell
八、变量
一、变量的组成
一、变量名
一、声明规范
二、声明方法
编辑
二、变量值
二、变量的类型
一、系统内置变量(环境变量)
二、自定义变量
三、位置变量
四、预定义变量
三、作用域
四、输出
五、shell中的字符串
一、获得字符串长度
二、字符串取子串
三、字符串截取
四、字符串拼接
五、字符串替换
九、运算符
一、数学运算
二、比较运算
一、条件测试
二、数值比较
三、字符串比较
四、文件比较
五、逻辑运算符
十、shell运行规则
十一、shell运行规则
一、没有x权限
二、有x权限
一、什么是shell脚本
Shell脚本是一种用于自动化操作系统任务的脚本语言。它是一种通过命令行界面执行的脚本,用于执行一系列的命令和操作,可以实现自动化的系统管理、文件处理、网络通信等操作。
Shell脚本通常运行在Unix或类Unix操作系统(如Linux)的命令行环境中。它使用一种脚本语言,可以调用操作系统提供的命令和工具,以及用户自定义的函数,实现一系列的操作和任务。
Shell脚本是纯文本文件,通常以.sh或.bash等扩展名结尾。它可以包含变量定义、条件判断、循环结构、函数定义等语法元素,用于实现复杂的逻辑和控制流程。
通过编写Shell脚本,用户可以批量执行一系列命令、处理大量的文件、定时执行任务、自动化系统管理等。Shell脚本是系统管理员、开发人员和运维人员常用的工具之一,能够极大地提高工作效率和操作方便性。
二、有哪些表达式
一、变量
预定义变量
位置变量
自定义变量
二、运算符
数学运算
数值比较
字符串比较
文件判断
布尔运算符
三、语句类型分哪几种
一、条件语句
if
二、分支语句
case
三、循环语句
for
while
四、函数
在Shell脚本中,函数是一种用于封装一系列命令和操作的结构。函数可以在脚本中定义和调用,它们使代码更模块化、可重用和易于维护。下面是一些关于Shell脚本函数的重要特点和介绍:
-
定义函数:在Shell脚本中,使用如下语法来定义函数:
function_name() { # 函数体 }
函数名可以由字母、数字和下划线组成,不能以数字开头。函数体是一系列的命令和操作,用于实现特定的功能。
-
调用函数:在脚本中,可以通过函数名来调用相应的函数,如下所示:
function_name
调用函数时,脚本会执行函数体中的命令和操作。
-
函数参数:函数可以接受参数,以便在调用时传递数据给函数。参数使用特殊变量
$1
、$2
、$3
等表示,分别代表第一个、第二个、第三个参数,以此类推。在函数中可以使用这些变量来获取传入的参数值。 -
函数返回值:函数可以通过
return
语句返回一个值。返回值可以是一个整数或字符串,使用return
语句后,脚本会终止当前函数的执行并返回该值。在调用函数时,可以使用$()
或反引号来获取函数的返回值。 -
局部变量:在函数内部,可以使用
local
关键字声明局部变量。局部变量的作用范围仅限于函数内部,不会对外部的同名变量产生影响。 -
函数调用的结果:在脚本中可以使用特殊变量
$?
来获取函数调用的结果。如果函数执行成功,则$?
的值为 0;如果函数执行失败,则$?
的值不为 0。
函数在Shell脚本中起到了组织和模块化代码的作用,可以增强代码的可读性、可重用性和可维护性。使用函数可以封装一些常用的操作,减少代码的重复编写,并提高脚本的效率和可扩展性。
五、正则表达式
一、标准正则
-
标准正则表达式(BRE):
- 基本元字符:
.*[]^$
- 限定符:
*
、+
、?
、{m,n}
- 字符类:
[...]
- 反向引用:
\n
- 范围表达式:
[a-z]
、[0-9]
- 特殊字符转义:
\
- 匹配行首和行尾:
^
、$
在Shell中,默认情况下,正则表达式都使用标准正则表达式的语法。使用标准正则表达式时,不能直接使用元字符
.
和|
等,而是将它们作为普通字符进行匹配。 - 基本元字符:
二、扩展正则
-
扩展正则表达式(ERE):
- 扩展元字符:
.*[]^$|(){}+?
- 集合:
[[:alnum:]]
、[[:digit:]]
- 字符类简写:
\w
、\d
、\s
- 分组:
(pattern)
- 逻辑操作符:
|
- 或操作符:
?|pattern1|pattern2|...
- 非贪婪操作符:
*?
、+?
、??
- 扩展的范围表达式:
{m,}
、{,n}
、{m,n}
使用扩展正则表达式时,可以使用更多的特殊字符和语法来匹配和处理文本。
- 扩展元字符:
在Shell脚本中,可以使用工具如grep
、sed
等来利用正则表达式进行文本的处理和匹配。
六、文件操作四剑客
1、find
2、egrep
3、sed
4、awk
七、shell
一、shell是一种命令解释器
-
sh(Bourne Shell):是Unix操作系统中最早的Shell,功能相对较简单。其脚本文件通常以.sh为扩展名,可以在大多数Unix系统中使用。
-
ssh(Secure Shell):是一种网络协议,用于在不安全的网络中提供安全的远程登录和文件传输。它也可以用作Shell脚本的远程执行工具。
-
bsh(Bourne Again Shell):是Bash Shell的简称,是Bourne Shell的改进版本,为Unix和Linux系统提供了更多的功能和特性。
-
csh(C Shell):是一种与C语言类似的Shell,具有更丰富的交互式功能,并提供了一些与C语言兼容的语法。
-
bash(Bourne Again Shell):是Unix和Linux系统中最常用的Shell,也是默认的命令行解释器。它是基于Bourne Shell的改进版本,提供了很多功能和扩展。
-
tcsh(TENEX C Shell):是C Shell的改进版本,增加了一些交互式和脚本编程的功能。
-
dsh(Distributed Shell):是一个用于在多台远程主机上同时执行命令的工具,可以实现批量远程命令执行。
-
zsh(Z Shell):是一个强大的Shell解释器,具有高级的命令补全、历史命令管理、拼写校正等特性,并提供了良好的脚本编程能力。
二、查看系统中支持的shell
cat /etc/shells
三、查看系统默认的shell
echo $SHELL
八、变量
一、变量的组成
一、变量名
不会变化
可以理解为一个容器 只是里面装的内容不一样而已
一、声明规范
不能是数字或者数字开头
要以_或字母开头
变量名不能包含特殊字符
二、声明方法
驼峰式 userName
双驼峰 UserName
NameALL这种也是双驼峰型
shell写法
user_name
username
USERNAME(在shell脚本中大写的字母一般用来表示常量或者全局变量)
二、变量值
不断变化 承载的物体(里面可以装任何东西,不固定)
数字、字符
二、变量的类型
一、系统内置变量(环境变量)
env
二、自定义变量
定义一个变量名,定义一个变量值 用赋值符号连接
varName=varValue
等号两边不能有空格
数字 var1=1
字符串
shell中可以不使用引号
当包含有空格时,需要使用引号
引号的用法 不会引用变量值 单引号 '
会应用变量值 双引号 "
引用命令结果 反撇号 `
$(命令)
应用场景较多
三、位置变量
$0 | 表示自身 |
$1 | 表示位置参数 |
$@ | 表示所有参数的列表 |
脚本内只能设置九个位置变量 | 脚本外不受限制 |
脚本后参数所在的位置就是位置变量(默认有9个位置变量 $1...$9)
相当于运行脚本的时候把后面两个参数一起传进来
直接启动没有颜色,但是ls有特殊性可以不跟参数
他是要调个别名
想让他恢复颜色
再次更改脚本
保存退出并验证
成功
传参数
./first.sh /opt/ /home/ (正着填写,反着验证)
特性只能从第一个位置变量跟到第九个位置变量
四、预定义变量
$0 脚本本身的名称 (运行自己)
脚本配置文件开头的格式应该是#! /bin/bash
代表从此刻开始所有的语句都是由bin/shell解析
赋予权限
一直运行自己
查看带颜色的脚本
.$# 脚本后参数的个数 (输出脚本后跟的位置变量的个数)
查看到底传进来几个参数
更改脚本 添加 echo $# 并验证
成功显示参数的个数
以此类推 每追加在验证 都会出现变化
如果加很多,他最多也只调9个,后面的调不出来,但是参数的个数正常显示
$* 脚本运行时参数的内容(整体输出 位置变量参数的内容)
验证
最下面单独显示了一遍结果
$@ 脚本运行时参数的内容(逐个输出 位置变量的内容)
验证
显示结果一致,$@是拼接式输出 不会换行 显示一样但是并不一致
验证脚本
第七行 逐个输出$*的内容
echo输出会换行检质
想要区别 $* 和 $@的区别 就写这样一个脚本
并验证
$? 脚本运行完毕后的返回值
默认情况 0成功 非0失败
这种提示成功
这种则提示失败
三、作用域
默认变量只在当前shell下生效
定义一个值 验证后刷新,在验证则失效
这种就是局部变量只在当前shell下生效 (刷新等于开启了一个子shell,不生效)
若要在当前及其子shell下生效,需要声明为全局变量 export (将局部变量升级为全局变量,全局变量不是在任意的shell下都可以调,必须是当前shell及其子shell才可以,切新shell则无效)
验证则成功生效
四、输出
echo $varName
五、shell中的字符串
举例 先赋值 str1=foodfornoting.gpg
一、获得字符串长度
echo ${#str1}
语法: ${#StringName}
显示结果为 17个字符
二、字符串取子串
echo ${str1:0:3} 从哪里开始 取几个 从0就是从第一个开始 往后三个则显示foo
如果是 -4的话则是从左往右 显示 foodfornoting
语法: ${#StringName:position:lenght}
三、字符串截取
1、echo ${str1##*fo} 从左至右截取最后一个匹配字符串string之后的所有字符串
从左往右查找最后的字符显示后面的内容
语法: ${StringName##*string}
2、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有字符串
从左往右查找第一个字符的内容并显示后面的内容
语法: ${StringName#*string}
3、echo ${str1%%o*} 从右至左截取最后一个匹配字符串string之后的所有字符串
从右往左查找最后一个字符串并显示后面的内容
语法: ${StringName%%string*}
4、echo ${str1#*fo} 从左至右截取第一个匹配字符串string之后的所有符串
语法: ${StringName#*string}
5、echo ${str2%%o*} 从右至左截取最后一个匹配字符串string之后的所有字符串
语法: ${StringName%%string*}
6、echo ${str2%o*} d)从右至左截取第一个匹配字符串string之后的所有字符串
语法: ${StringName%string*}
四、字符串拼接
StringName3=${StingName1}${StringName2}
五、字符串替换
语法: ${StringName/OldString/NewString}
九、运算符
一、数学运算
+
-
*
因为*也有代表全部的意思 所以为了让系统识别是运算 要添加转义符 * 作为乘号时需要加转义符\
%(除)
shell不支持浮点数的显示
二、比较运算
一、条件测试
二、数值比较
-eq 等于 echo $? 查看结果 0显示成功 非0表示失败
-ne 不等于
-lt 小于
-le 小于等于
-gt 大于
-ge 大于等于
test 测试
三、字符串比较
= 字符串一致
!= 字符串不一致
-z 字符串为空
! -z 字符串不为空
四、文件比较
-e 文件或目录是否存在
-f 是否为文件
-d 是否为目录
-r 判断文件是否可读
-w 判断文件是否可写
-x 判断文件是否可执行
五、逻辑运算符
十、shell运行规则
shell脚本编写规范
第一行 #!/bin/bash
第二行 #脚本的说明
第三行 脚本正文
十一、shell运行规则
一、没有x权限
bash 脚本所在路径/脚本文件
source 脚本所在路径/脚本文件
. 脚本所在路径/脚本文件
二、有x权限
./脚本文件
脚本绝对路径/脚本文件
shell脚本运行追踪 bash -x 脚本所在路径/脚本文件
echo $[$RANDOM%100] 返回100内随机数
seq 1 10 返回1到10 的连续数字
{1..10} 返回1到10 的连续数字
seq 1.1 10.1 返回1.1 2.1 3.1.... 10.1