诸葛亮教你学shell,你确定学不会吗?精华版教程

本文详细解读了如何编写shell脚本,包括创建用户时的安全考虑、自动配置本地yum源及检查启动httpd服务。通过实例演示,从基础交互到高级应用,助你理解shell脚本的编写与实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本图来自网络
请添加图片描述

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服务,场景
在这里插入图片描述


评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术职场教练

您的是我坚持原创免费作品的不懈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值