本图来自网络
shell是什么?
刘备:孔明先生,给我的这张图是什么意思,备才疏学浅,实在看不懂,请先生示下?
诸葛亮:简言之,计算机只能识别二进制,如:1011101110000等等,而我们难以记住这么多东西,所以我们通过shell将只有我们能懂的命令解释给系统内核,再去执行,实现相应功能。
shell脚本是什么?
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。Shell脚本与Windows/Dos下的批处理相似,将各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。但是它比Windows下的批处理更强大。
shell脚本语法
刘备:孔明先生,说了这么多,我还是不会编写,请您讲讲怎么做shell脚本,有什么需要注意的?
诸葛亮:给皇叔一个锦囊,如有遇到shell,请打开,亮为您做三个shell实例,请皇叔细观!
实例:
1.编写批量创建用户脚本 ,要求密码自动创建为123.com ,用户名前缀为student 创建数量用键盘读取
第一种:
1)编写脚本,注意:如果 复制我的脚本,注释需要删掉
#!/bin/bash //声明
read -p "Please enter user name:" -t 30 NAME //键盘交互输入,提示信息、输入用户名前缀、超时时间30秒
read -p "Please input the number of users:" -t 30 NUM //键盘交互输入,提示信息、创建用户数量、超时时间30秒
read -p "Please input the password of users:" -t 30 PASS //键盘交互输入,提示信息、密码、超时时间30秒
if [ ! -z "$NAME" -a ! -z "$NUM" -a ! -z "PASS" ] //判断三项输入参数不为空,则
then
Y=$(echo $NUM | sed 's/[0-9]//g') //输入的NUM变量值为数值类型
if [ -z "$Y" ]
then
for ((i=1;i<=$NUM;i=i+1)) //创建用户
do
useradd $NAME$i &> /dev/null //用户名以输入名加序号组成
echo $PASS | passwd --stdin $NAME$i &> /dev/null //创建密码
done
fi
fi
2)执行脚本
3)验证:这时已经成功了,进一步验证密码,可以用20个账号中的任意一个登录,省略
第二种:企业一般为了保证密码安全,不允许键盘输入明文密码,这种,把密码写到代码里。
1)编辑脚本:
#!/bin/bash //声明
read -p "Please enter user name:" -t 30 NAME //键盘交互输入,提示信息、输入用户名前缀、超时时间30秒
read -p "Please input the number of users:" -t 30 NUM //键盘交互输入,提示信息、创建用户数量、超时时间30秒
if [ ! -z "$NAME" -a ! -z "$NUM" ] //先判断三项输入参数不为空
then
Y=$(echo $NUM | sed 's/[0-9]//g') //再判断输入的NUM变量值为数值类型
if [ -z "$Y" ]
then
for ((i=1;i<=$NUM;i=i+1)) //创建用户
do
useradd $NAME$i &> /dev/null //用户名以输入名加序号组成
echo 123.com | passwd --stdin $NAME$i &> /dev/null //创建密码
done
fi
fi
2)验证:
正向验证,输入符合条件参数,创建成功,且可以登录
登录成功即可,登录student20切换19,输入密码123.com
反向验证,输入不符合条件参数(空值,或者,用户数量不为数字),不创建
脚本不执行,且指定目录查不到用户文件
第三种:检测被创建用户是否存在
分析思路:是if双分支语法结构,内部嵌套一个for循环语句。
1)编辑脚本:注意,格式必须和我的对齐,否则,可能报错!
#!/bin/bash
read -p "Please input user name:" USER
read -p "Please input user number:" NUM
if grep -w $USER /etc/passwd //判断输入用户是否已存在
then
echo "$USER already exist,failed! " //若存在,提示,并退出
exit 1
else
for i in $(seq 1 $NUM) //变量i赋值为从1到变量NUM的值
do
useradd $USER$i //用户名为变量USER与i组合
echo 123.com | passwd --stdin $USER$i &> /dev/null //创建密码123.com,并不屏幕输出
done
echo "successfully created! " //屏幕提示:successfully created!
fi
2)正向验证:用户不存在,则创建并提示successfully created!
反向验证:如果输入已存在用户,提示already exist,failed!并退出
温馨提示:怎么用最短时间编出最好脚本?以下几点牢记!
- 标准 代码单词要做到顾名思义;成对出现的,先写固定格式,再添里面内容。例如:脚本名是create_users.sh;时间久了,编的脚本一多,容易忘记哪个脚本是干吗的。变量名用大写,如果报错,定位错误是在某变量方面,我们只关注大写字母,是不是比全部查找容易?有候,偷懒简写,在特定场景中,用到的元素少,代码少,可能不会报错,但总有报错的时候,养成良好习惯,能从根本避免报错。
- 智能 多方面考虑,比如:为了安全性,避免明文输入密码;考虑到输入参数错误,提醒用户等等!!
- 简化 在保证,做到了符合标准,又方便使用的前提,尽可能简化代码,number可以简写成NUM,提高效率,代码量少,出错的概率也减少。
- 优化 一个需求,可以有多种方式满足,我们要不断优化,找到最匹配当前业务需要的脚本
2.编写一个自动配置本地yum源的脚本
编辑内容如下:
#!/bin/bash
#This is a script shell for configuring local yum
mkdir /etc/yum.repos.d/backup
mount /dev/cdrom /media
cd /etc/yum.repos.d/
mv /etc/yum.repos.d/*.repo ./backup
cat > local.repo << E
[local]
name=local
baseurl=file:///media
gpgcheck=0
E
验证:命令查看仓库列表,有刚创建的东西,成功
3.判断httpd服务是否正常运行,不正常自动启动(httpd添加到系统服务为例)。
1)编辑脚本:
内容如下:
#!/bin/bash
#This is a check httpd server script
lsof -i:80 //查看httpd服务端口号
if [ $? -eq 0 ] //返回值,为0;证明httpd服务开启
then
echo "httpd is up" //屏幕输出:httpd is up
else
echo "httpd is down now restart server" //否则,屏幕输出:httpd is down now restart server
systemctl restart httpd //重启httpd服务
fi
2)验证:运行脚本
未开启httpd服务,场景
已开启httpd服务,场景