shell脚本编程:以创建删除用户脚本为例

  • 初学linux,初次写脚本文件,记录一下这次遇到的问题和解决办法

  • 先说一下规定,脚本文件名称一般以.sh结尾。文件内部开头是文件的魔数,即规定靠那个解释程序来执行它,只有这样系统才会把它识别成一个可以执行的脚本文件,否则只当它是一个普通的文本文件。第一行通常是#!/bin/bash

  • 同其它编程语言一样,也是有顺序结构、选择结构、循环结构,然后分别有对应的关键字。

  • 条件测试,所谓条件测试其实就是一个能得出布尔值的一个表达式(在linux的脚本中,0表示真,其它值都是假);表达式有数值、字符串比较大小,另外命令执行状态结果会以数值表示,也可以表现为布尔值。而且,我们通常在写有先后因果关系的命令语句时,会用到命令执行状态的结果。
    在一连串的命令的连写中,执行与否的逻辑由&&或||来控制,如果写在一行,命令之间可以用 ; 隔开,但是即便隔开了,甚至用{ }或者将()括起来,&&或||等也只能影响其后的一条命令,后面的命令还是会执行,所以要想严格控制那条命令执行哪条不执行,一般都一条命令配一个&&或||;执行的逻辑是:&&符号前面为真(即它前面的应该执行的命令都执行成功时),它后面紧跟的命令才会执行,否则就执行其后的命令或后面的第一个||符号后面紧跟的命令,然后后面继续。

   #!/bin/bash
   #下面这两种整体取反都可以,双方括号里面要用 &&、|| 等互相连接;
   #单方括号内用-a、-o等连接,并且单方括号内的变量一定要用双引号引起来,否则会有问题(比如当$1值不存在或为空的时候)
   3 ! [[ -z $1 || $1 == "abc" || $1 == "efg" ]] && echo "否定之否定" || echo "肯定之否定"
   4 ! [ -z "$1" -o "$1" == "abc" -o "$1" == "efg" ] && echo "否定之否定" || echo "肯定之否定"

  • 下面看一个添加用户、删除用户的脚本案例:
      首先声明了(其实Shell中的变量可以不声明,在哪用到直接拿来赋值就行)ATC变量用来保存用户执行的动作,是要添加用户还是删除用户;VB变量用来保存文件执行完成后,要不要给用户反馈执行结果的提示信息;USERS变量用来保存用户要添加或者删除的用户;
      用户可能会传的参数有-h(获取帮助提示信息),-v(显示命令执行结果提示),-add users (添加用户),-del users (删除用户)
      首先检测用户是否传入参数,没传参的话直接退出,并提示错误;如果 用户传入的第一个参数是-h,那么就不再考虑后面的参数了,直接返回帮助信息;
      如果用户第一个参数是-v,即用户希望执行完成后给与结果提示,所以给变量赋值VB=yes,做个标记(当然用户也有可能在动作参数后面给出-v参数);然后用shift命令消去第一个参数,接下来的是动作参数,所以这里用了for循环,循环了两次,一次是VB的标记,一次是要执行的动作ACT的动作标记(顺便用USERS存储了要操作的用户信息)
      如果用户第一个参数是-add或者-del等动作参数,类似上面操作,先将标记存储起来,然后用shift 2消去两个参数(包括了要操作的users的信息,所以是两个),然后判断是否也传了-v的参数。
      最后根据这些标记做统一的动作处理;

注:在linux中,$USER代表当前用户,$?代表上一条命令执行结果的状态值。在shell脚本文件中,$0 代表脚本文件自身,$1、$2、$3...代表用户执行文件时,依次传的参数,$#代表参数的个数(当文件中使用了shift命令,这执行的过程中,$#、$1、$2...都会随着改变),$@、$*代表所有传入的参数。

  1 #!/bin/bash
  2 #
  3 ATC=NO
  4 VB=NO
  5 USRES=
  6 if [ $# -eq 0 ]; then
  7   echo 'USAGE: need args'
  8   exit 1
  9 fi
 10
 11 for I in {1,2}; do
 12   case $1 in
 13   -h|--help)
 14     echo "USAGE: usr -add user1,user2...; -del user1,user2..."
 15     exit ;;
 16   -v|--verbose)
 17     VB=YES
 18     shift ;;
 19   -add)
 20     ACT=1
 21 #    [ -z "$2" ] && echo "-add need followed users"; exit 2 || echo "哈哈"; USERS=$2; echo '赋值'
 22    [[ -z $2 || $2 == "-v" || $2 == "--verbose" ]] && echo "-add need followed users" && exit     2 || USERS=$2
 23     shift 2 ;;
 24   -del)
 25     ACT=2
 26    [ -z "$2" -o "$2" == "-v" -o "$2" == "--verbose" ] && echo "-del need followed users" && exit 2 || USERS=$2
 27     shift 2 ;;
 28   *)
 29     [ $# -gt 0 ] && echo "bad args..." && exit 1
 30   esac
 31 done
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容