壹、脚本的环境准备
一、#!/bin/bash 解释
#!/bin/bash
以 #! 开头
用于指定命令解释器
python 脚本
#!/bin/python3
推荐书写脚本时务必添加,尤其是脚本后续给系统服务使用、系统调用的场景。
二、如何创建脚本的时候自动添加说明信息
#1.修改 /etc/vimrc(红帽系统)或 /etc/vim/vimrc(ubuntu、debian 系统)
#2.增加以下内容
autocmd BufNewFile *.py,*.cc,*.sh,*.java,*.bash exec ":call SetTitle()"
func SetTitle()
if expand("%:e") =~ 'sh\|bash'
call setline(1,"#!/bin/bash")
call setline(2, "##############################################################")
call setline(3, "# File Name: ".expand("%"))
call setline(4, "# Version: V1.0")
call setline(5, "# Author: Newman")
call setline(6, "# Organization: www.oldboyedu.com")
call setline(7, "# Description:")
call setline(8, "##############################################################")
call setline(9, "")
endif
endfunc
#3.使用 vi/vim 创建以.bash 或.sh 结尾的文件(如 vim lidao.sh、vim oldboy.bash、vim sys_check.sh)。
贰、变量
| 变量分类 | 说明 | |
|---|
| 普通变量(局部变量) | 最常用,命名不能以数字开头命名最好体现出变量功能 ip=sys_ip net_ip | echo ${name}避免金庸新作问题 |
| 特殊变量 | $? $n $0 $# $*$@ | 判断,循环搭配使用 |
| 环境变量(全局变量) | PATH,PS1,LANG,UID | UID主要用于检查是否为root |
一、普通变量
“金庸新作” 问题示例:
name=lidao
echo $nameoldboy
echo ${name} oldboy
二、特殊变量
| 常用必会特殊变量 | 说明 | 应用场景 |
|---|
| $0 | 脚本名字 | 错误输出时,提示用户如何使用脚本,结合判断使用 |
| $n | 位置参数,命令行参数内容通过$1、$2、$… 形式传递到脚本中,实现简易交互 / 传参 | 脚本检查常用,是命令行与脚本的桥梁 |
| $# | 脚本参数个数 | 与判断结合使用,检查参数个数 |
| $* | 取出脚本所有参数,相当于写$1、$2…$n | 与循环搭配 |
| $@ | 取出脚本所有参数,相当于写$1、$2…$n | 与循环搭配 |
| $? | 检查上一个命令是否执行成功 | echo $?返回值是0成功 返回值是其他失败 |
a、 案例 01 – 检查指定服务状态
脚本内容(01.check_service.sh):
#!/bin/bash
#File Name: 01.check_service.sh
#Version:V1.0
#Author:lidao996
#Organization:www.oldboyedu.com
#Description:
#1.vars
name=$1
#2.systemctl
echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
systemctl is-active $name
systemctl is-enabled $name
b、案例 02 – 检查指定的用户是否存在
脚本内容(02.check_user.sh):
#!/bin/bash
#FileName:02.check_user.sh#Version:V1.0
#Author:lidao996
#Organization:www.oldboyedu.com
#Description:
#1.vars
name=$1
#2.id
id $name
c、案例 03 – 改造案例 01 和 02 增加脚本参数个数判断功能
改造后脚本(01.check_service.sh):
#!/bin/bash
#FileName:01.check_service.sh
#Version:V1.0#Author:lidao996
#Organization:www.oldboyedu.com#Description:
#1.vars
name=$1
#2.check vars
if [ $# -eq 0 ]
then echo "Usage: bash $0 server name"
exit 1
fi
#2.systemctl echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
systemctl is-active $name
systemct is-enabled $name
d、案例 04 – 案例 01、案例 02 改造成批量形式
改造后脚本(01.check_service.sh):
#!/bin/bash
#File Name: 01.check_service.sh
#Version:V1.0
#Author:lidao996
#Organization:www.oldboyedu.com
#Description:
#1.varsname="$*"
#2.check vars
if [ $# -eq 0 ]
then echo "Usage:bash $0 server name"
exit 1
fi
#2.systemctl echo"请睁开眼睛看服务是否启动与开机自启动,后续改为if判断"
systemctl is-active $name
systemctl is-enabled $name
e、案例 05 – 回收站脚本替代 rm 命令
#1.准备操作:
df -h /tmp/ 结果示例:
1.5G 44K 1.5G 1% /tmp
tmp 目录属于 tmpfs(内存),系统重启后内容消失
#2.执行以下命令
umount -lf /tmp;
systemctl mask tmp.mount
#3.操作上面两个命令后df -h /tmp/结果示例
47G 12G 36G 25% /
脚本内容(05.recycle.sh):
#!/bin/bash
#File Name:/server/scripts/shell/05.recycle.sh
#Version:V1.0
#Author:lidao996
#Organization:www.oldboyedu.com
#Description:
#1.vars
files="$∗"
recycle_dir=`mktemp -d`
#2.check
if [ $# -eq 0 ]
then echo "Usage: bash $0 files dirs"
exit 1
fi
#3.mv
mv $files $recycle_dir
#4.结果输出
echo "$files已经放到回收站中,目录$recycle_dir"
别名配置:
临时生效:alias rm='bash /server/scripts/shell/05.recycle.sh'
永久生效:将上面的命令写入到 vim /etc/profile中
source /etc/profile
创建一个文件
touch a.txt
删除文件测试
rm a.txt
三、环境变量
| 环境变量 | 作用 |
|---|
| PATH | 存放命令的位置 / 目录 |
| PS1 | 命令行格式 |
| LANG | language 语言、字符集 |
| UID | 获取当前用户的 UID,搭配判断是否为 root |
f、案例 06 – 安装指定的软件包
脚本内容(06.install_rpm.sh):
#!/bin/bash
#File Name: 06.install_rpm.sh
#Version:V1.0
#Author:lidao996
#Organization:www.oldboyedu.com
#Description:
#1.vars
names="$@"
#2.root?if [ UID−ne0]
then echo"You are not root,use root user."
exit 1
fi
#3.$#
if [ $# -eq 0 ]
then echo "USAGE: bash $0 packages.."
exit 2
fi
#4.yum
yum install -y $names
#5. 待补充检查
#6.先用普通用户再用root用户测试
bash 06.install_rpm.sh tree lrzsz