shell脚本
脚本:能够运行的文本
1.什么是shell(解释性语言)
shell时操作系统的一个软件
它包括在linux内核的外部,为用户和内核之间的交互提供了一个接口
系统中的命令用shell去解释shell接受系统回应的输出并显示其到屏幕中
bash = GNU Bourne Again Shell
2.什么是shell脚本
脚本是一种解释性语言
用shell脚本保存执行动作
用脚本判定
3.脚本启动方式
ctrl+z 把程序打入后台
fg将后台软件调入前台
sh调用:用sh作为解释器和设定的脚本解释器无关
vim /mnt/test.sh
#!/bin/bash ##脚本解释器(幻数),代码运行环境
watch -n 1 date
(1)sh + 脚本名称
(2)脚本名称的绝对路径(需要添加执行权限)
(3)source + 脚本名称
source:用当前的shell作为解释器,不会开启新的shell
4.注释
(1)使用快捷键的方式为每次编辑脚本文件时,为其添加注释。
vim /etc/vimrc
67 map <F5> ms:call WESTOS()
68 function WESTOS()
69 call append(0,"#############################")
70 call append(1,"# Autho: #")
71 call append(2,"# Create-Date: ".strftime("%Y-%m-%d")." #")
72 call append(3,"# Version: 1314 #")
73 call append(4,"# Mail: yc@163.com #")
74 call append(5,"# Description: #")
76 call append(6,"# #")
77 call append(7,"#############################")
78 endfunction
(2)编辑特定的文件时,为其自动添加注释
vim /etc/vimrc
68 autocmd BufNewFile *.sh exec ":call WESTOS()"
69 function WESTOS()
70 call append(0,"#############################")
71 call append(1,"# Autho: #")
72 call append(2,"# Create-Date: ".strftime("%Y-%m-%d")." #")
73 call append(3,"# Version: 1314 #")
74 call append(4,"# Mail: yc@163.com #")
75 call append(5,"# Description: #")
76 call append(6,"# #")
77 call append(7,"#############################")
78 endfunction
5.shell中的文本生成器
(1)diff(检测)中常用的参数
-b 不检查空格字符的不同
-B 不检查空白行
-c 显示全文内容,并标出不同之处
-c+数字 显示不同之处和其前几行和后几行
-i 不检查大小写的不同
-p 若比较的文件为c语言的程序码文件时,显示差异所在的函数名称
-q 仅显示有无差异,不显示详细的信息
-r 比较子目录的文件
-u 以合并的方式来显示文件内容的不同
diff test test1
(2)patch
yum install patch -y
diff -u test test1 > test.path ##生成补丁
patch test test.path ##为test打补丁
patch -b test test.path ##打补丁时,备份源文件
(3)字符截取
cut -d 指定分隔符
cut -f 1,7|1-7 指定截取的列
cut -c 1,4|1-4 指定截取的字符位置
(4)字符排序
sort -n 纯数字排序
sort -r 倒序
sort -u 去掉重复数字
sort -o 输出到指定文件中
sort -t 指定分隔符
sort -k 指定要排序的列
(5)uniq
对重复字符做相应的处理
uniq -u 显示唯一的行
uniq -d 显示重复的行
uniq -c 每行显示一次并统计重复次数
sort westos
sort -n westos
sort -rn westos
sort -run westos
sort -n westos | uniq -c
sort -n westos | uniq -d
sort -n westos | uniq -u
sort -t : -k 2 westos
sort -t : -k 2 -n westos
(6)&&和||
&&用来执行条件成立后执行的命令
||用来执行条件不成立执行的命令
ping -c1 -w1 172.25.254.111 &&echo yes ||echo no
ping -c1 -w1 172.25.254.111 &> /dev/null &&echo yes ||echo no
test命令
test命令和[]命令等同
test “A"=="A"=="A"=="B” 等同 [“A"=="A"=="A"=="B”]
[ “A"="A" = "A"="B” ]
[ “A"!="A" != "A"!="B” ]
[ ! “A"="A" = "A"="B” ]
[ “A"−eq"A" -eq "A"−eq"B” ] 等于
[ “A"−ne"A" -ne "A"−ne"B” ] 不等于
[ “A"−le"A" -le "A"−le"B” ] 小于等于
[ “A"−lt"A" -lt "A"−lt"B” ] 小于
[ “A"−gt"A" -gt "A"−gt"B” ] 大于
[ “A"−ge"A" -ge "A"−ge"B” ] 大于等于
-z为空
-n非空
[ “westos” -ef “westos1” ] ##判断文件是否相同
[ “westos” -nt “westos1” ] ##判断前文件是否比后文件新
[ “westos” -ot “westos1” ] ###判断前文件是否比后文件旧
文件id—>inode
ln链接
文件内容被系统记录的次数
[ -e “file” ] ##判断是否存在
[ -f “file” ] ##判断是否为文本文件
[ -L “file” ] ##判断是否为链接
[ -S “file” ] ##判断是否为套接字
[ -b “file” ] ##判断是否为块设备
[ -d “file” ] ##判断是否为目录
[ -c “file” ] ##判断是否为字符设备
1 #!/bin/bash
2 [ -z “$1” ] &&echo Please give me a filename || {
3 [ -e “$1” ] || echo not exist
4 [ -f “$1” ] && echo it is a file
5 [ -L “$1” ] && echo it is a link
6 [ -S “$1” ] && echo it is a socket
7 [ -b “$1” ] && echo it is a block
8 [ -d “$1” ] && echo it is a directory
9 [ -c “$1” ] && echo it is a character device
10 }
1 df | grep /dev/vda1 > available
2 cut -d ’ ’ -f 18 available > a
3 b=82
4 [ “a"−ge"a" -ge "a"−ge"b” ] && echo Warning || echo no
{}表示其中所有内容属于一个程序
()表示其中所有内容属于一个整体
[]表示test命令
(7)tr 大小写转换
vim westos
hello world
[root@shell mnt]# tr ‘a-z’ ‘A-Z’ < file
HELLO WORLD
[root@shell mnt]# tr ‘A-Z’ ‘a-z’ < file
hello world
6.shll中的正则表达式,报告生成器
(1)正则表达式
grep root passwd 找出passwd文件中包含root的行
grep -i root passwd 找出passwd文件中包含root的行并忽略大小写
grep “^root” passwd 找出passwd文件中以root开头的行
grep “root$” passwd 找出passwd文件中以root结尾的行
grep “<root” passwd 找出passwd文件中root无前缀的行
grep “root>” passwd 找出passwd文件中root无后缀的行
grep “<root>” passwd 找出passwd文件中root单独存在(无前缀,无后缀)的行
grep -E “root|ROOT” passwd 找出passwd文件中满足包含root或包含ROOT的行
grep -E “root&ROOT” passwd=egrep “root&ROOT” passwd
找出passwd文件中同时满足包含root和ROOT的行
grep “w…s” passwd 找出ws之间有两个字符的行
grep “w…” passwd 找出w后有三个字符的行
grep “…s” passwd 找出s之前有两个字符的行
|或,&与
|不属于标注正则表达式,属于扩展正则表达式
egrep和 grep -E 效果相同
-v表示反向
练习