开发者学堂课程【Linux Shell 编程入门与实战:shell 脚本与或费逻辑判断及磁盘管理实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/551/detail/7624
shell 脚本与或费逻辑判断及磁盘管理实战
一、shell脚本编程基础
(一)条件测试
1、判断某需求是否满足,需要由测试机制来实现,专用的测试表达式需要测试命令辅助完成测试过程;
2、评估布尔声明,以便用在条件性执行中
(1)若真,则返回0
(2)若假,则返回1
3、测试命令:
(1)test EXPRESSION
test命令可以用来判断后面的表达是否成立,test本身是一个内部命令,test命令的用法可以通过输入help test。输入help test 之后,可以看到后面跟了[expr]称为表达式。
执行结果或返回的状态是0或者1,0代表真,1代表假;test的结果是根据0或者1的状态来进行判断。
test 命令支持对各种各样的条件判断,比如对文件的判断、字符串的判断、数字运算的判断;
下面是列举几个较为简单的进行讲解:
字符串的比较:
比如有 str1=aaa;str2=bbb 进行比较两个字符串是否相同,就可以输入test $str1=$str2(注意等号前后有空格)进行比较;是否相等通过输入echo $?表示为0则为成功的,显而易见,两者并不相同为假。
通过更改数据,使str2=aaa,现在两者数据相同,最后得到的结果为0,即是真。
以上证实test命令可以进行比较。另外还可以判断字符串的长度、字符串的大小等。
判断字符串是否为空(就是是否为0)操作:
通过输入[ -z $var ],echo $?,结果为真,现在给它进行赋值:var=haha ,[ -z $var ] ,echo $?得到的结果为非空;-n为非空。
字符串比如为[“abc”]到底为真还是假,实际上输入[“abc”]等价-n,所以是非空。如果输入[“”]则为空、输入[ ]也为空;输入[ 0 ]则不为空。
不为空显示为0,为空显示为1;学习以上知识以后,再结合短路与短路或进行讲解。
短路与的逻辑关系是“cmd1 && cmd2”前面的命令如果为真,需要执行命令2,前面的命令为假,则不需要执行命令2。
执行x=haha;y=xixi; [“$x”= “$y”] && echo equal] 或者写成x=haha;y=xixi;[“$x”= “$y”] && echo equal] || echo no equa]。
如果[“$x”= “$y”] 为真,就执行echo equal] 命令,诚然echo equal]命令肯定为真,所以整体都为真,如果整体都为真,则为短路或,则后续命令不需要执行。
相反,如果[“$x”= “$y”] 不相等,即为假,则短路与不需要执行后续命令,则整体为假。 数字判断操作如下:
比方两个数字进行比较。执行m=10 n=20 [ $m -eq $n ] && echo equal]|| echo no equal ] 得到两个数值不相等,当改成相同时,输出结果相等。
一般带有-eq=equal表示相等,-nq=no equal表示不相等;less equal表示大小。
学习以上知识,如何判断分区定律。比如分区定律大于80,执行警报wall disk will be full;当然如果低于80,则不报警;执行N-diskcheck.sh脚本。该脚本的功能是检查分区定律。
分区定律的做法是将最大的数字找出,大于则报警;所以在进行操作的时候需进行排序。进行操作时可以先把dv开头的进行过滤,后续再用相关命令将数字进行取出。
需要注意的是在执行操作的时候,在中括号里面的变量要加双引号,否则就可能出现语法错误。
判断输入的是否是数字,需要用到“=~”(表示左侧字符串是否能够被右侧的PATTERN所匹备,
注意:
此表达式一般用于[[ ]]中;扩展的正则表达式-z”STRING” 字符串是否为空,空为真,不空为假;-n “STRING” 字符串是否为空,不空为真,空为假,
注意:
用于字符串比较时的用到的操作都应该使用引号)。比方现在表示需写成 [[ “$n” =~ ^[[:digit:]]+$ ]] && echo digit || echo no digit(为真时打印digit,为假时打印no digit)。需要注意的是在赋值时,数值必须为正数。
在前面讲过的例子,当时没有考虑数值的问题,如果不等于2或者不是数字或者只要有一个条件不符合,都应执行退出。如果是数字,判断方法,使用“=~”进行判断。
例如:
输入[$# -ne 2 ] && echo “Arg number ;[ “$1”=~ ^ [0-9]+$ ];如果执行非数字时,则输入[[ ! “$1” =~ ^[0-9]+$ ]] && echo “ $1” is not digit “ && exit;同理:操作$2时,把$1换成$2即可。
注意在执行操作时,不仅要检查个数,还要检查$1和$2是不是数字。
进行以上操作之后,执行看结果,参数个数不对,原因出在其中有一个不是数字(一个是数字,一个是字母)前面如果不是数字也可以进行判断,所以要全面考虑;以上是正则表达式的用法。(如果是取非数字,则加!号)(逻辑运算:非:!;!1=0;!0=1;
短路运算:短路与:第一个为0,结果必定为0;第一个为1,第二个必须要参与运算。
短路或:第一个为1,结果必定为1;第一个为0,第二个必须要参与运算。异或:^;异或的两个值相同为假,不同为真。)
接下来实现一个功能,假如在当前的目录里存在多个文件,判断文件的后缀是否为ss后缀,如果是ss后缀需执行操作,如果不是ss后缀则不需要执行任何操作。
假设对$^clename变量进行判断它是否为ss后缀,写出表达式:[[ $filename =~*\.sh$ ]] && echo sh || echo no sh;
进行赋值:filename a.sh,执行操作,便可判断文件后缀。
test语句支持文件判断,以下都是文件判断
如上图所示:
前面加“-”都称为普通文件。比方判断[ -d /etc/ ]可以用-d,-d是判断文件夹。
注意,后面如果加上redhat-release就不是文件夹;所以进行判断时,注意细节。
以上文件判断只针对普通用户,比如判断:/etc/shadow的权限,执行结果显示没有权限,说明判断权限看的是实际权限,看实际权限和真正的权限,而不是表面权限。
结合全面所讲的工具和命令,有些问题就可以得到解决,比方实现一个创建用户的功能。
把用户名:
username=haha放入变量,针对变量创建功能:useradd $username。需要注意在创建时,应事先判断账号是否存在,如果有,则无需创建,没有则需要创建。同时指定用户的口令。创建时用户名跟在后边,创建时如果用户存在,则显示用户已经存在。
判断用户存在性,执行id root,判断是否成功执行id root &>/dev/null或者id root &> /dev/null。
(1)[EXPRESSION]
(2)[[EXPRESSION]]
注意:EXPRESSION前后必须有空白字符