测试
在一个程序或者脚本运行时经常需要根据实际情况来运行特定的命令或者代码块。比如,判断某个文件或目录是否存在,如果不存在则需要创建
例如:
测试的第一种方法:
使用方法是直接使用test
命令,格式:
其中express是一个表达式,可以是算术比较、字符串比较、文本和文件属性比较等
——————————————
测试的第二种方法:
使用[
启动一个测试再写express,再以]
结束测试。注意:括号和表达式express之间都有空格(推荐使用第二种方式)
文件测试
shell中提供了大量文件测试符,其格式如下:
或者
file_operator是文件测试符,FILE是文件、目录(可以是文件或目录全路径)
——————————————
例如:判断文件是否存在
提一下关于权限方面的:
- -w 当文件存在且为可写
- -r 当文件存在且可读
- -x 当文件存在且可执行
if
判断结构if是最简单的判断语句,可以针对测试结果做相应处理:如果测试为真则运行相关代码,语法格式如下:
如果expression测试返回为真,则执行command。如果要执行的不止一条命令,则不同命令之间用换行符隔开,如下所示:
- eq:equql平等的,相等的
- gt:greater较大的,大于
- lt:less then 小于
- -eq 检测两个数是否相等,相等返回true。[ $a -eq $b ]返回false
- -ne 检测两个数是否不等,不等返回true。[ $a -ne $b ]返回true
- -gt 检测左边的数是否大于右边的,如果是 则返回true。[ $a -gt $b ]返回false
- -lt 检测左边的数是否小于右边的,如果是 则返回true。[ $a -lt $b ]返回true
- -ge 检测左边的数是否大于等于右边的,如果是 则返回true。 [$a -ge $b]返回false
- -le 检测左边的数是否小于等于右边的,如果是 则返回true。[$a -le $b]返回true
——————————————
练习:写一个脚本判断用户得分情况
如果小于等于30分,则输出‘太low了’
如果大于30分且小于60分,则输出‘加油’
如果大于等于60分且小于85分,则输出‘刚过及格线哈’
如果大于等于85分,且小于等于99分,则输出‘优秀’
如果等于100分,则输出‘针不戳’
如果大于100分,则输出‘?你啥情况 开挂是不’
使用if...then
实现:
if/else
判断结构if/elif/else
判断结构可以代替if嵌套,语法结构如下
练习:写一个脚本,查询用户是否存在,如果存在,则输出‘有此用户,ta的uid为:’,如果没有则输出‘没有此用户,并且创建’
- 输出重定向
- ‘>’ 覆盖重定向
- ‘>> ’ 追加重定向
- ‘2>’ 错误重定向
- ‘2>>’ 错误追加重定向
- ‘&>’ 同时重定向,不管正确与否
- /dev/null 数据黑洞
case
判断结构和if/elif/else判断结构一样,case判断结构也可以用于多种可能情况下的分支选择。
语法结构如下
语法原理:从上到下依次比较VAR和var1、var2、var3的值是否相等,如果匹配则执行器后面的命令语句,都不匹配,则匹配最后的默认*,执行其后面的默认命令。注意:case判断结构中的var1、var2、var3等这些值只能是常量或者正则表达式
练习:编写一个脚本检查本机操作系统
练习
1,创建2个数组
name组里分别有:toukui, jianbang,xiongjia,yaodai,hushou,hutui,xiezi
score组里分别有:78 45 24 99 68 84 63
2,根据以上的数组,写一个脚本,可以做到查询对应的装备名字,得到对应的分数
3,写一个装备查询系统,输入情况查看装备品相
如果装备类别小于等于30分,那么则输出,“粗糙”
如果装备分数大于30并且小于等于65那么输出“精良”
如果装备分数大于65并且小于等于95则输出“史诗”
如果装备分数大于95分输出“传说”
4,根据上述3的要求增加一些条件,优化脚本:如果分数低于30就会询问用户是否强化
(由于脚本篇幅较长,且有重复,下面只列举出一个分支)
function
功能函数可以在shell script当中做出一个类似自订执行指令的东西,最大的功能就是可以简化我们很多的程序码。如果输出的内容都一样,那么我们就可以使用function来简化了
function语法
fname是我们自订的执行指令名称,程序段就是要执行的内容了
要注意:因为shell script的执行方式是由上而下,由左而右,因此在shell script当中的function的设置一定要在程序的最前面,这样才能够在执行时被找到可用的程序段
while
循环、until
循环shell中的循环主要有 for,while,until,select
whell循环
while的中文是“当什么什么时”,所以,这种方式是“当condition条件成立时,就进行循环,直到condition的条件不成立才停止”的意思
——————————————untile循环
这种方式与while恰恰相反,它的意思是“当condition条件成立时,就终止循环”
举个栗子until循环
写一个脚本,求1+2+3+4…+100的值是多少
写一个脚本,让用户输入密码,如果输入错误超过5次就自动退出,并提示密码已经被锁定
for
循环最常见的循环结构。for循环是一种运行前测试语句,也就是在运行任何循环体之前都要判断条件是否成立,只有在条件成立的情况下才会运行循环体,否则将退出循环。每循环一次后,在进行下一次循环之前都会再次进行测试
带列表的for语句
用于执行一定次数的循环(循环次数等于列表里的元素个数)
语法结构如下
语法示例
for
循环格式如下
expression1为初始化语句,一般用作变量定义和初始化;
expression2为判断表达式,用于测试表达式返回值并以此控制循环,返回值为真则循环继续,返回值为假则退出循环;
expression3用于变量值修改,从而影响expression2的返回值,并以此影响循坏行为;
- 1、while循环的特长是执行守护进程以及我们希望循环不退出持续执行的情况,用于频率小于一分钟循环处理,其他的while循环几乎都可以被for循环替代
————————————————————————- 2、case语句可以替换if语句,一般在系统启动脚本传入少量固定规则字符串,用case语句。其他普通判断多用if语句
————————————————————————- 3、if和for语句最常用,其次是while(守护进程),case(服务启动脚本)
各个语句的应用场景:
条件表达式,简单的判断(文件是否存在,字符串是否为空等)
if取值判断,不同值数量较少的情况
for循环正常的循环处理,常用
while循环守护进程、无限循环(sleep)
case服务启动脚本,菜单
函数逻辑清晰,减少重复语句