脚本要求:

   1. 编写一个脚本createuser.sh,脚本的执行语法必须是:createuser.sh -u username -m password,选项与参数间可支持多空格,但不能顺序颠倒。当未指定正确的选项或参数时,以错误输出方式提示“createuser.sh -u username -m password ”后退出脚本。
   2. 用户名必须以字母开头,可包括数字和_。否则不合法。以错误输出提示用户"用户名仅包含字母数据和下划线"当用户名检测合法后。

   3. 判断用户名是否已存在,若存在,再判断用户是否已设置过密码,若设置过密码,直接退出,未设置,则将密码设置为所指定的密码后以正确输出方式显示“username 密码已更新后退出”

   4. 当用户名不存在,则创建用户,并为该用户设置所指定的密码后以正确输出方式显示“用户username已创建并更新密码”

   5. 要求脚本执行过程中不能有非要求的其他输出结果出现。脚本在非正确方式退出时应反回给?参数非0值。

解决步骤:

  思想: 

    看起来问题挺复杂的,无从下手。而我们要把问题分为若干个小的问题去解决,我就简单的把这个脚本分为了以上五个小的模块,然后一个一个去解决它。

  • 第一个模块

要求:编写一个脚本createuser.sh,脚本的执行语法必须是:createuser.sh -u username -m password,选项与参数间可支持多空格,但不能顺序颠倒。当未指定正确的选项或参数时,以错误输出方式提示“createuser.sh -u username -m password ”后退出脚本

wKiom1mFd0HCaQlBAABv7Wq0A28577.png

#判断是否满足有四个参数

if [ $# -ne 4 ];then

#提示用户输入错误

echo "createuser.sh -u username -m password"

#不满足退出

exit
#第一个参数是否是 -u
elif [ $1 != "-u" ];then
echo "createuser.sh -u username -m password"
exit

#第三个参数是否是 -m
elif [ $3 != "-m" ];then
echo "createuser.sh -u username -m password"
exit
fi

  • 第二个模块

要求:用户名必须以字母开头,可包括数字和_。否则不合法。以错误输出提示用户"用户名仅包含字母数据和下划线"当用户名检测合法后。

wKioL1mFenDy7sVhAAAMZubbNx4005.png

echo $2|egrep -i "^[a-z]+([a-z]*|[_]*|[0-9]*){100}$

就这一句就满足了以上要求不过没有提示用户

^[a-z]+ 用户名字母开头

([a-z]*|[_]*|[0-9]*){100}$  后边可以为字母下划线数字把他们三个弄成一个整体用{100}表示重复100次直到用户名结尾(只重复了100次,我想也不会有人把用户名设置成100位一上)

  • 第三个模块

要求:判断用户名是否已存在,若存在,再判断用户是否已设置过密码,若设置过密码,直接退出,未设置,则将密码设置为所指定的密码后以正确输出方式显示“username 密码已更新后退出”

wKiom1mHETrSeIuDAAA9zDzJxpM685.png

(cat /etc/passwd |cut -d : -f 1|egrep ^$2$ &&
cat /etc/shadow|grep ^$2:|cut -d : -f2|grep !  &&

echo "$4" | passwd --stdin $2) &>/dev/null && echo $2 " 密码已更新" &&
exit

# &>/dev/null 是把前边命令执行成功或者失败的提示丢掉不显示

# echo "$4" | passwd --stdin $2 把$4第四个参数(passwd)做为密码传递给$2第二个参数(username)

  • 第四个模块

要求:当用户名不存在,则创建用户,并为该用户设置所指定的密码后以正确输出方式显示“用户username已创建并更新密码”

wKioL1mFfiXiiEvyAABI3Kz3rMs442.png

(echo $2|egrep -i "^[a-z]+([a-z]*|[_]*|[0-9]*){100}$" &&
useradd $2 &&

echo "$4" | passwd --stdin $2) &>/dev/null &&
echo  $2  "已创建并更新密码"||echo "用户名仅包含字母数据和下划线" &&
exit

第四个模块是建立在里一个模块上完成的

  • 第五个模块

要求:要求脚本执行过程中不能有非要求的其他输出结果出现。脚本在非正确方式退出时应反回给?参数非0值。

第五个模块就是对上四个模块的一个完善和补充

&>/dev/null 是满足没有其他的输出结果

exit [ ] 是退出返回的错误参数

  • 综合

截图:

wKioL1mFgV6gFW4jAAEJysco8AI060.png

代码:

#!/bin/bash
# Filename createuser53.sh
# Revision: 1.1
# Date: 2017/8/5
# Author: xin
# ------------------------------------------
#参数是否满足四个
if [ $# -ne 4 ];then
echo "createuser.sh -u username -m password"
exit 1
#第一个参数是否是 -u
elif [ $1 != "-u" ];then
echo "createuser.sh -u username -m password"
exit 2
#第三个参数是否是 -m
elif [ $3 != "-m" ];then
echo "createuser.sh -u username -m password"
exit 2
fi
#判断用户是否存在,若存在是否设置过密码
(cat /etc/passwd |cut -d : -f 1|egrep ^$2$ &&
cat /etc/shadow|grep ^$2:|cut -d : -f2|grep !  &&
echo "$4" | passwd --stdin $2) &>/dev/null && echo $2 " 密码已更新" &&
exit 4 || exit
   #用户不存在满足条件创建用户并设置密码
   (echo $2|egrep -i "^[a-z]+([a-z]*|[_]*|[0-9]*){100}$" &&
   useradd $2 &&

echo "$4" | passwd --stdin $2) &>/dev/null &&
   echo  $2  "已创建并更新密码"||echo "用户名仅包含字母数据和下划线" &&
   exit 5


wKioL1mFgq6C4ulpAAAdMueIhOw260.png

创建了一个名为 ceshi 密码为:123的用户测试成功