目录
一、shell脚本基础
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
shell脚本用途
-
将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
-
减少手工命令的重复输入,一定程度上避免人为错误
-
将软件或应用的安装及配置实现标准化
-
用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
二、shell脚本构成
-
脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect
-
注释信息:以#开头的语句表示为注释信息
-
可执行语句:比如echo命令用于输出“ ”之间的字符串
三、脚本执行方式
脚本有三种执行方式
1.使用绝对或相对路径执行脚本
【注:这种执行方式需要脚本有执行权限】
没有执行权限直接使用绝对或相对路径执行脚本会提示权限不够
加了执行权限后可以使用绝对或相对路径执行脚本
2.通过解释器去执行(bash)
这个执行方式不需要脚本有执行权限也可以执行,而且会在后台自动再开一个shell执行,不会影响当前开启桌面
3. 使用source或. 执行脚本
这个执行方式也不需要执行权限,但是不会在后台新开脚本,而是直接在当前shell运行,一般不建议使用
四、重定向与管道符
1.重定向
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
2.管道符
管道符是 | 可以讲左边命令输入的结果输出给右边命令作为处理对象输入,且可以叠加使用

五、变量
变量分为很多种
1.自定义变量
自定义变量命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
大驼峰 StudentFirstName
-
小驼峰 studentFirstName
-
下划线 student_name
变量引用
$ 直接引用
${} 直接引用
' ' 强引用,只会输出引号内容而不输出变量的值
" " 弱引用,这里输出变量的值
2.环境变量
环境变量一般由系统提前创好,用来设置用户工作环境
3.只读变量
只读变量是变量值不允许修改的变量无法使用unset删除
4.位置变量
位置变量也叫位置参数
$0 当前脚本名
$1 位置1
$2 位置2
$10 位置1和位置0
${10} 位置10
$* 将所有项当成一个整体
$@ 所有项分别显示
$# 后面参数个数
5.预定义变量
$*:表示所有位置参数的内容看成一个整体返回 返回所有
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$#:表示命令行中位置参数的总个数
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
$$:当前进程id
$!: 后台任务最后一个id
六、条件语句
1.if语句
单分支if语句格式
if 判断条件;
then 条件为真的分支代码
fi
双分支if语句格式
if 判断条件; then
条件为真的分支代码
else
条件为假的分支代码
fi
多分支if语句格式
if 判断条件1
then
条件1为真的分支代码
elif 判断条件2
then
条件2为真的分支代码
elif 判断条件3;then
条件3为真的分支代码
...
else
以上条件都为假的分支代码
fi
2.case语句
case 变量引用 in
PAT1)
分支1
;;
PAT2)
分支2
;;
...
*)
默认分支
;;
esac
3.echo语句
echo -n 表示不换行输出
echo -e 表示输出转义符
七、 正则表达式
1.元字符
. 匹配任意单个字符,可以是一个汉字
[] 匹配指定范围内的任意单个字符,示例:[zhou] [0-9]
[^] 匹配指定范围外的任意单个字符,示例:[^zhou] [^a.z] [a.z]
2.表示次数
* #匹配前面的字符任意次,包括0次
.* #任意长度的任意字符,不包括0次
\? #匹配其前面的字符出现0次或1次,即:可有可无
\+ #匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} #匹配前面的字符n次
\{m,n\} #匹配前面的字符至少m次,至多n次
\{,n\} #匹配前面的字符至多n次,<=n
\{n,\} #匹配前面的字符至少n次
3.位置锚定
^ #行首锚定, 用于模式的最左侧
$ #行尾锚定,用于模式的最右侧
^PATTERN$ #用于模式匹配整行
^$ #空行
^[[:space:]]*$ # 空白行
4.分组
分组:() 将多个字符捆绑在一起,当作一个整体处理,如:(root)+
后向引用:分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名
方式为: \1, \2, \3, ...
\1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符
5.扩展正则表达式
* 匹配前面字符任意次
? 0或1次
+ 1次或多次
{n} 匹配n次
{m,n} 至少m,至多n次
{,n} #匹配前面的字符至多n次,<=n,n可以为0
{n,} #匹配前面的字符至少n次,<=n,n可以为0