初学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