鉴于这道题太麻烦,我单独列出来写一篇
题目
:编写一个脚本/root/bin/createuser.sh,新建用户
要求:
1.脚本的执行语法必须是:createuser.sh -u username -m password,选项与参数间可支持多空格,但不能顺序颠倒。
2.当未指定正确的选项或参数时,以错误输出方式提示“createuser.sh -u username -m password ”后退出脚本。
3.用户名必须以字母开头,可包括数字和_。否则不合法。以错误输出提示用户"用户名仅含字母数据和下划线"
4.当用户名检测合法后,判断用户名是否已存在,若存在,再判断用户是否已设置过密码,若设置过密码,直接退出,未设置,则将密码设置为所指定的密码后以正确输出方式显示“username 密码已更新后退出”
5.当用户名不存在,则创建用户,并为该用户设置所指定的密码后以正确输出方式显示“用户username已创建并更新密码”
6.要求脚本执行过程中不能有非要求的其他输出结果出现。脚本在非正确方式退出时应反回给?参数非0值。
(1)先来分析一下这道题的逻辑
(2)尽量减少语句嵌套
如果不用if或者case ;就会比较麻烦;需要减少逻辑判断的嵌套。
那就可以把两个直接退出的判断单拎出来放到脚本执行的最前面。如果flase,直接退出。符合要求才向下执行接下来的脚本。
(3) 开始写脚本
语句一 :
[ "$1" == "-u" -a "$3" == "-m" ] || ( echo createuser.sh -u username -m password;exit 1 )
为什么对格式判断只判断 -u 和-m
当在shell命令行输入时,会自动根据空格来区分脚本执行和各个位置变量,不用关心空格多少;根据题目要求把-u和-m 的顺序固定就好了。
语句二:
上面那行是在命令行的测试
下面这行是要写在脚本里的代码
注意:[[]] 的判断只支持扩展正则表达式
语句3: (最麻烦的)
综合:
注意:
单大括号,{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开。
对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令。
注意: ()在使用时,若 (exit ),则退出的是(),而不是脚本所在的shell。
前方高能
终于把这道题做出来了。本来是打算用if 做的,可是又想挑战下;一边写着博客,一边自己做;折腾了半天。
只有最爱的 张艺兴 才能安慰我。