一、脚本概述
1.Shell脚本是一种解释型语言
2.用Shell脚本保存执行命令
3.用脚本判定命令的执行条件
4.用脚本实现命令的批量执行
二、脚本基础知识
1.脚本编写
#!/bin/bash ##执行脚本的shell类型
2.脚本运行
sh file.sh ##用sh打开脚本
chmod +x file.sh ##添加执行权限
/mnt/file.sh ##用脚本本身的shell打开
3.脚本调试
sh -x file.sh
+ echo hello ##命令行
hello ##运行结果
4.自动添加脚本信息说明
编辑配置文件 /etc/vimrc
"map <F4> ms:call Westos()<cr>'s ##按F4自动添加信息Westos函数 (" 表示注释)
autocmd BufNewFile *.sh,*.script exec ":call Westos()" ##以.sh .script结尾的文件编辑时自动添加文本信息
func Westos()
call append(0,"##############################")
call append(1,"# Author : #")
call append(2,"# Date :".strftime("%Y-%m-%d").(" #"))
call append(3,"# Mail : #")
call append(4,"# Version : #")
call append(5,"# Description : #")
call append(6,"# #")
call append(7,"##############################")
call append(8,"")
call append(9,"#!/bin/bash")
call append(10,"")
endfunc
三、基本脚本命令
1.diff ##比较文件差异
1.对比两个文件的不同
diff -q file1 file2
文件 file1 和 file2 不同
diff -c file1 file2 ##列出不同
diff -r westos1 westos2 ##比较两个目录的区别
只在 westos2 存在:westos2
diff file1 file2
2,3c2,3 ##改变file1的2,3才能匹配file2的2,3
< 123 ##第一个文件的第二行
< ##第二个文件的第三行
---
> 456 ##第二个文件的第二行
> 111 ##第二个文件的第三行
2.生成补丁
diff -u file1 file2 ##生成补丁
diff -u file1 file2 > file.path ##将补丁保存在file.path中
patch
(1).安装补丁软件 patch.x86_64
(2).打补丁
patch file1 file.path ##给file1加入补丁-->变成file2
3.打补丁的同时对原文件备份(.orig)
patch file1 file.path -b
cat file1.orig ##备份的原file1
2.cut ##多用于截取字符
1.cut参数
cut -d ##指定分隔符
cut -f 1 ##指定截取每行第1列字段
cut -c 3 ##指定截取每行第3个字符
2.示例应用
cut -d : -f 1-3 passwd ##以:为分隔符截取1-3列字段的信息
cut -d : -f 1 passwd ##以:为分隔符截取第一列字段的信息
cut -c 1-3 passwd ##截取第1-3字符信息
grep bash /etc/passwd | cut -d : -f 1 ##显示可以登陆的用户信息
ifconfig eth0 | head -n 2 | tail -n 1| cut -d " " -f 10 ##显示主机ip
3.sort ##多用于字符排序
- sort参数
sort -n ##纯数字排序 sort -r ##倒序
sort -u ##去掉重复数字 sort -o ##输出到指定文件中
sort -t ##指定分割符 sort -k ##指定要排序的列
sort -n file ##正序输出
sort -rn file ##倒序输出
sort -rnu file ##倒序输出不显示重复的个数
sort -rn file | uniq -c ##倒序输出并输出个数
sort -n file -o file1 ##正序排列保存在file1中
2.对mnt文件排序,找出最大的两个文件
ll | sort -t " " -k 5 -rn | head -n 2 ##显示/mnt中的最大的两个文件
4.uniq ##对重复字符的处理
- uniq参数
uniq -u ##显示唯一的行
uniq -d ##显示重复的行
uniq -c ##每行显示的次数
##注意:配合sort命令使用
sort -n file | uniq -u ##正序并显示只出现过一次的数字
sort -n file | uniq -d ##正序并显示重复的行
sort -n file | uniq -c ##正序并显示出重复的次数
5.&&和||
1.&& 用来执行条件成立后执行的命令
2.|| 用来执行条件不成立后执行的命令
显示ping其他主机的结果
ping -c1 -w1 172.25.254.16 ##ping一次
ping -c1 -w1 172.25.254.16 && echo yes || echo no
ping -c1 -w1 172.25.254.16 &> /dev/null && echo yes || echo no
yes
6.test ##判断条件是否成立
- test 参数
test 等同于 [ ]
字符型数据
[ "$a" = "$b" ] ##$a和$b是否一致
[ "$a" != "$b" ] ##$a和$b是否不一致
[ ! "$a" = "$b" ] ##$a和$b是否一致,且该条件不成立时
整型数据
[ "$a" -eq "$b" ] ##是否$a = $b
[ "$a" -ne "$b" ] ##是否$a != $b
[ "$a" -lt "$b" ] ##是否$a < $b
[ "$a" -le "$b" ] ##是否$a <= $b
[ "$a" -gt "$b" ] ##是否$a > $b
[ "$a" -ge "$b" ] ##是否$a >= $b
[ "$a" = "$b" -o "$a" -lt "100" ] ##$a是否等于$b,或者$a小于100
[ "$a" = "$b" -a "$a" -gt "100" ] ##$a是否等于$b,并且$a大于100
[ -z "$a" ] ##$a是否为空
[ -n "$a" ] ##$a是否不为空
文件
[ "file1" -ef "file2" ] ##节点是否一致,即文件是否一样
[ "file1" -nt "file2" ] ##file1是否比file2时间new
[ "file1" -ot "file2" ] ##file1是否比file2时间out
[ -e "file" ] ##文件是否存在
[ -f "file" ] ##是否是普通文件
[ -L "file" ] ##是否是软链接文件
[ -S "file" ] ##是否是套接字
[ -b "file" ] ##是否是块设备
[ -d "file" ] ##是否是目录
[ -c "file" ] ##是否是字符文件
2.判断数字是否在0-10之间
[ $1 -gt "0" -a $1 -lt "10" ] && echo yes || echo no
3.编写脚本clean_log.sh,当超级用户时,清空日志,当普通用户,提示请切换用户
User_Id=`id -u`
[ "$User_Id" -eq "0" ]&& `> /var/log/messages` || echo You are not root!!
4.编写脚本check_file.sh判断文件类型
vim /mnt/file.sh
#!/bin/bash
[ ! -e "$1" ]&&{
echo $1 is not exit!!
exit
}
[ -b "$1" ]&&{
echo $1 is a block device!!
exit
}
[ -f "$1" ]&&{
echo $1 is a common file
exit
}
运行脚本:
sh file.sh /etc/passwd
/etc/passwd is a common file
7.find ##查找文件
1.find 参数
-group ##查找组
-type ##查找类型
-user ##查找用户
-not -group ##查找不是该组的文件
-a | -o ## and | or
-perm 777 ##精确匹配权限777的文件
-perm -644 ##匹配u=6、g=4、o=4的文件
-perm /666 ##匹配u=6或g=6或o=6的文件
-size 20k ##查找文件大小为20k的文件
-size -20k ##查找文件大小为小于20k的文件
-size +20k ##查找文件大小为大于20k的文件
-maxdepth 1 -name passwd ##查找目录的深度为1层
-mindepth 2 -maxdepth 2 -name passwd ##只查找目录的第2层
注意:最大深度为2层
8.tr ##转换字符
cat /mnt/test -- 123412
tr '1-2' 'a-b' < /mnt/test ---ab34ab
tr 'a-z' 'A-Z' < /mnt/test ---小写变成大写
tr '3' '#' < /mnt/test ---3变#
三、简单脚本练习
1.运行脚本 ip_show.sh 显示当前主机ip
ifconfig eth0 | head -n 2 | tail -n 1 | cut -d " " -f 10
2.运行脚本 user_show.sh 显示当前主机可登陆的用户
grep -E "bash$|tcsh$|sh$|csh$" /etc/passwd | cut -d : -f 1
3.运行脚本 clear_log.sh 清空当前日志
USER=`whoami`
[ "$USER" = "root" ]||{
echo -e "Please run this script with root!"
exit
}&&{
rm -fr /var/log/messages /var/log/secure /var/log/maillog
touch /var/log/messages /var/log/secure /var/log/maillog
echo -e "cleared log files"
}