1.什么是shell
shell是操作系统中的一个软件,它包在linux内核的外面,为用户和内核之间的交互提供了一个接口。系统中的命令用shell去解释,shell接收系统回应的输出并显示到屏幕上。
shell脚本
shell script(程序化脚本)是利用shell的功能所写的一个“程序”,这个程序是使用纯文本文件,将一些shell的语法和指令写在里面,搭配正则表达式,管线命令与数据流重导向等功能,用shell脚本保存执行的动作,实现动作的批量执行。
2.shell脚本的格式
shell脚本文件名称可以任意,但为了避免被认为是普通文件,加上.sh 后缀,以表示是一个脚本文件。
shell脚本中一般会出现三种:
- 第一行的脚本声明(#!)用来告诉系统使用哪种shell解释器来执行脚本;
- 第二行 #注释信息:对脚本功能和命令的介绍信息
- 执行语句
3.vim创建脚本文件自动添加头部注释
vim /etc/vimrc
"开头行为注释行
"map <F9> ms:call WESTOS()<cr>'s
设置用快捷键来自动生成,一般不用快捷键,都是自动生成
autocmd BufNewFile *.sh,*.script exec ":call WESTOS()"
新创建的以.sh或.script结尾的文件自动生成头部注释
function WESTOS()
call append(0,"########################")
call append(1,"#Author #")
call append(2,"#Create_Time: ".strftime("%Y-%m-%d")." #")
call append(3,"#mail #")
call append(4,"#Version: #")
call append(5,"#Description: #")
call append(6,"# #")
call append(6,"########################")
call append(7,"")
call append(8,"#!/bin/bash")
endfuction()
4. 脚本的调用:
脚本建立完成后,有四种调用方式:
-
sh +脚本绝对路径的方式可以执行
-
直接输入脚本的绝对路径进行执行
前提是脚本文件有执行权限
chmod +x 脚本所在路径 -
source test.sh
-
. test.sh
注意:
- 第一种
sh test.sh
与 第二种 直接输入脚本的绝对路径进行执行,将会开启一个新的shell环境去执行,
(不指定便使用默认的shell环境,linux下默认的shell是Bourne Again Shell(bash),可以使用$SHELL变量来查看) - 第三种和第四种,在当前的shell解释器环境中运行`
示例:
a=1
vim test.sh
echo $a
source test.sh
或者 . test.sh
不可以用sh test.sh,因为变量a属于环境级变量,只在当前环境中生效,与执行test脚本的不是同一个环境
ps f
查看后台进程运行环境之间的关系
5.利用脚本设置shell环境颜色
6.shell脚本中的常用命令
6.1 diff
比较两个文件或目录的差异,以行为单位来进行对比。
diff 将两个文件或目录的内容进行比较
参数:
-b:忽略一行当中,仅有多个空白的差异(例如"haha"与"ha ha "视为相同
-B:忽略空白行的差异。
-i:忽略大小写的不同。
-u:显示文件信息的不同
显示内容的含义
[num1,num2][a|d|c][num3,num4]
num1,num2 #表示在第一个文件中的行数
num3,num4 #表示在第二个文件中的行数
a #表示添加---add
c #表示更改---change
d #表示删除---delete
< #表示第一个文件中的内容,
> #表示第二个文件中的内容
--- #分割线
diff比较文件:
test文件第二行被test1第二行替换,就内容相同。
新旧文件要修改数据的界定范围,旧文件在 1-2 行,新文件在 1-2 行
123
-haha #删除haha
+o haha #加上o haha
diff比较目录:
-r 递归比较目录
6.2 patch
常与diff配合使用
yum install patch -y
-R :代表还原,将新的文件还原成原来旧的版本
-b :备份文件。在修补文件时,重命名或复制原始文件,而不是删除它
diff -u test1 test2 > test.patch
#生成补丁文件 test.patch
patch -b test1 test.patch
#修补文件test1,并备份原来的文件,生成 test.orig
6.3 cut
cut -d 指定分隔符
-f 截取域
-c 指定字符
输出以:分隔的第一列和第三列
输出以:作为分隔符的第一列到第四列
示例:
截取主机的 ip 地址
ifconfig | head -n 2 | tail -n 1 | cut -d " " -f 10
截取主机的 ip 地址,以‘空格’为分隔符,截取第 10 列
6.4 sort
sort 多用于字符排序
-n 纯数字排序
-r 倒序
-u 唯一,去掉重复数字
-o 输出到指定文件
-t 指定分隔符
-k 指定要排序的列
sort test(不加任何参数,只对第一位数字进行排序)
指定以:为分隔符,对第二列进行排序
6.5 uniq
对重复字符作相应的处理。
uniq -u 显示与周围相比,唯一的行的数字
uniq -d 显示重复的行的数字
uniq -c 每行显示一次并统计重复次数
找出登陆本机次数最多的主机IP
6.6 $$,||
&&
逻辑“与”的运算符 &&,表示当前面的命令执行成功后才会执行它后面的命令
||
逻辑“或”的运算符 ||,表示当前面的命令执行失败后才会执行它后面的命令
6.7 test []
test 等价于 [ ]
= 相等
!= 不相等
-eq 相等
-ne 不相等
-le 小于等于
-lt 小于
-ge 大于等于
-gt 大于
-a and
-o or
-z 是否为空
-n 不为空
示例:
a=""
[ -z "$a" ] && echo yes || echo no
yes
-ef 文件标号相等
-nt file1是否比file2新
-ot file1是否比file2旧
软链接(多个节点号对应一个数据区域)
ln -s ping.sh hahaha
hahaha为满权限,为了不影响ping.sh操作权限
硬链接(一个节点号对应多个数据区域)
ln ping.sh haha
ls -i 查看节点号
cp 复制节点号,也复制数据区域
-e 文件是否存在
-f 普通文件
-L 连接文件
-S 套接字
-b 块设备
-d 目录
-c 字符设备
写一个脚本测试:
硬链接
ls -i 查看节点号
ln ping.sh haha
haha为ping.sh的硬链接
ln -s ping.sh xixi
xixi为ping.sh的软链接
检测是否为套接字
6.8 tr
tr 可以用来删除一段信息当中的文字,或者是进行文字信息的替换
eg: 将 w 输出的信息中,所有的小写变成大写字符:
w | tr 'a-z' 'A-Z'