1.什么是shell
脚本中命令的解释器,可以把我们编写的命令解释成系统可以识别的语言,然后系统再去执行
2.shell脚本的意义
1.记录命令执行的过程和执行逻辑,方便以后重复执行
2.脚本可以批量处理主机
3.脚本可以定时处理主机
3.如何创建shell脚本
#!/bin/bash
#幻数,指定系统当中的解释器(cat /etc/shells命令可以查看系统中所有的解释器),
是脚本中最先执行的命令,开启环境,下面的命令都在该环境中执行
常规的脚本中,最前面几行都会写一些注释,但是每个脚本都要自己写注释的话会很麻烦,所以我们可以修改vim的配置文件,使得每次写脚本时自动添加注释
vim /etc/vimrc #编辑vim的配置文件,使得每次在编写脚本时自动添加脚本首部
在配置文件最后添加的文件内容:
map <F4> ms:call WESTOSTITLE()<cr>'s
#调用函数方式一,映射快捷键,按F4时会执行下面的函数
autocmd BufNewFile *.sh,*.script call WESTOSTITLE()
#调用函数方式二,文件是新的并且以.sh或.script结尾时,自动调用
func WESTOSTITLE() #表示函数
call append(0,"#############################################") #0表示第一行
call append(1,"# Author: lee") #call表示调用
call append(2,"# Version: ")
call append(3,"# Create_Time: ".strftime("%Y/%m/%d")) #自动采集时间
call append(4,"# Mail: [email protected]")
call append(5,"# Info: ")
call append(6,"# ")
call append(7,"##############################################")
call append(8,"")
call append(9,"#!/bin/bash")
endfunc
执行效果:
4.如何执行shell脚本
1).方式一
手动在环境中开启指定解释器
sh script.sh
2).方式二
直接在当前环境中运行shell中的指令不开启新的shell
source script.sh
或
. script.sh
3).方式三
开启脚本中指定的shell并使用此shell环境运行脚本中的指令
chmod +x script.sh
/xxx/xxx/script.sh
./script.sh(注意:rhel8中是/script.sh,没有点)
注意:这三种方式是有区别的,如下:
方式一:是用自己指定的shell,在执行的过程中不会调用脚本中的幻数,只是在当前的shell中开了一个子shell
方式二:开启新的shell是一个新的纯净的环境,如果不开启新的shell,就是在当前的shell中执行命令,当前的shell可能被设置过,并不是一个纯净的shell。
方式三:开启脚本中指定的shell并使用此shell环境运行脚本中的指令
5.如何对脚本进行调试
sh -x /mnt/westos.sh #-x:显示运行的过程
+ #运行指令
不带+ #命令运行的输出结果
6.脚本练习
1、
ip_show.sh 网卡 显示当前的网卡名称
参考:
nmcli device status|awk '$2~/ethernet/{print $1}'
2
host_messages.sh 显示当前主机的名称,ip,登陆当前主机的用户
显示效果如下:
hostname: xxxxx
ipaddress: xxxx.xxxx.xxx.xxx
username: root
参考:
#!/bin/bash
2
3 hostnamectl | head -n 1| cut -d " " -f 5,6
4
5 [ -z "`ifconfig ens160 |awk '/inet\>/{print $2}'`" ] || {
6 echo "ipaddress: `ifconfig ens160 | awk '/inet\>/{print $2}'` "
7 }
8
9 echo "username: $USER"
3.
编辑脚本clear_log.sh 执行此脚本后可以清空日志
参考:
#!/bin/bash
[ "`whoami`"="root" ]||{
echo "Error:Only root can run this scirpt!"
exit #只有root用户才可以
}
for log_name in $(awk '/./&&!/^#/&&!/^\$/&&$2~/^\/|^\-/{print $2}' /etc/rsyslog.conf | sed 's/-//g')
#筛选日志文件
do
> $log_name &&{
echo $log_name is cleared
}
done
###for语句
2、
结果:
3、
结果: