目录
一、什么是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