尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

# Linux Shell 编程入门 Day02:条件测试、if 判断、循环与随机数

# Linux Shell 编程入门 Day02:条件测试、if 判断、循环与随机数 课前拓展 我们都知道布尔值bool条件成立输出 1不成立输出 0。但在shell编程中绝大多数规则却相反件成立返回 0条件不成立返回 非 0常见为 1。这里我们不去深究原因但是要进行区分清楚这两种情况满足布尔特性成立 1不成立 0是1非0的数学运算$(()) /bc比较运算不满足布尔特性是0非1的条件判断[ ]、test、[[ ]]、所有文件 / 字符串 / 权限测试表达式总结算数比较1 真 0 假Shell 判断0 真 1 假一、条件测试让 Shell 拥有“判断能力”1.1 Shell 脚本智能化条件测试是脚本实现自动化的核心用于为命令执行提供判断依据支持四类判断文件/目录的存在、权限、类型状态整数大小比较字符串匹配/空值判断多条件逻辑组合1.2[ ]条件测试基础Shell 提供两种条件测试写法[ ]为最常用写法方式1test 命令几乎已经不再使用test 选项 参数方式2[ ] 写法推荐[ 选项 参数 ]✅强制规范[ ]内侧左右必须各留至少一个空格否则语法报错。1.3字符串比较单字符串判断空/非空[操作符 字符串]-z判断字符串为空成立返回0失败返回非 0! -z注意与-z之间的空格判断字符串非空等价于-n不建议使用-n虽然与!z等价但是-n使用起来注意事项较多更建议使用!z[rootserver ~]# [ -z abc ] #判断字符串abc是空的失败/错误注意不加$代表只是普通的字符串而不是变量字符串当然不是空的[rootserver ~]# echo $? #查看返回值为非01[rootserver ~]# [ -n abc ] #判断字符串abc是非空的成功/正确[rootserver ~]# echo $? #查看返回值为00[rootserver ~]# namezhangsan #定义变量name值为zhangsan[rootserver ~]# [ -z $name ] #判断变量$name的值是空的失败/错误[rootserver ~]# echo $? #查看返回值为非01双字符串比较[字符串1 操作符 字符串2]两个字符串相同!两个字符串不相同[rootserver ~]# [ abc haha ] #判断两个字符串相同失败/错误[rootserver ~]# echo $? #查看返回值为非0[rootserver ~]# [ abc abc ] #判断两个字符串相同正确/成功[rootserver ~]# echo $? #查看返回值为0[rootserver ~]# namelisi #定义变量name值为lisi[rootserver ~]# [ lisi $name ] #判断lisi和name变量值相同正确/成功[rootserver ~]# echo $? #查看返回值为0[rootserver ~]# classcloud #定义变量class值为cloud[rootserver ~]# [ $class $name ] #判断两个变量值相同正确/成功[rootserver ~]# echo $? #查看返回值为011.4整数比较整数比较操作符[整数值1 操作符 整数值2]基础示例[rootserver ~]# [ 3 -eq 3 ][rootserver ~]# echo $?0[rootserver ~]# [ 3 -eq 8 ][rootserver ~]# echo $?1[rootserver ~]# [ 5 -lt 20 ][rootserver ~]# echo $?0[rootserver ~]# [ 5 -lt 2 ][rootserver ~]# echo $?1建议这样简化操作步骤[ a 操作符 b ] echo $?这里仅仅是基础演示写的较为繁琐一些变量与命令结果比较整数比较支持变量比较、也支持对表达式的运行结果比较[rootserver ~]# age18 #定义变量age值为18[rootserver ~]# [ $age -eq 30 ] #判断age变量的值等于30失败/错误[rootserver ~]# echo $? #返回值结果为非0[rootserver ~]# ps aux | wc -l #统计系统进程数量[rootserver ~]# [ $(ps aux | wc -l) -ge 100 ] #判断系统进程数量大于100[rootserver ~]# echo $? #查看返回值1.5文件状态测试[操作符 文件/目录]重点是前三个选项注意-d,-f也可以确认文件是否存在[ -f 文件名 ]文件存在 且 是普通文件[ -d 目录名 ]目录存在 且 是目录因此-f/-d可以直接用来判断文件/目录是否存在[rootserver ~]# [ -e /etc ] #判断/etc存在[rootserver ~]# echo $? #返回0[rootserver ~]# [ -e /etc/hosts ] #判断/etc/hosts存在[rootserver ~]# echo $? #返回0[rootserver ~]# [ -f /etc ] #判断/etc存在且是文件[rootserver ~]# echo $? #返回非0[rootserver ~]# [ -f /etc/hosts ] #判断/etc/hosts存在且是文件[rootserver ~]# echo $? #返回0[rootserver ~]# [ -d /etc ] #判断/etc存在且是目录[rootserver ~]# echo $? #返回0[rootserver ~]# [ -d /etc/hosts ] #判断/etc/hosts存在且是目录[rootserver~]# echo $? #返回非0注意权限判断中判断的是当前用户相对的权限1.6多条件组合/||/;主要用法[ 条件1 ] 操作符 [ 条件2 ]命令1 操作符 命令2逻辑符含义;前命令执行完继续执行后命令不管前一条成功还是失败无条件执行下一条逻辑与都成立才为真。前一条执行成功才执行后一条前一条失败直接终止不往后跑。||逻辑或一个成立即为真。前一条失败了才执行后一条前一条如果成功就不执行后面。常用示例验证逻辑与和逻辑或||[rootserver ~]# [ $USER root ] [ $UID -eq 0 ] #判断当前用户为root且UD为0正确[rootserver ~]# echo $? #查看返回值为0[rootserver ~]# [ $HOME /home/root ] || [ $USER root ] #判断及目录为/home/root或当前用户为root[rootserver ~]# echo $? #查看返回值为0使用控制符组合多个命令[rootserver ~]# head -1 /etc/shells ; hostname #执行完命令1再执行命令2[rootserver ~]# [ a a ] echo Y || echo NY[rootserver ~]# [ a b ] echo Y || echo NN[rootserver ~]# [ 3 -eq 3 ] echo Y || echo NY[rootserver ~]# [ 2 -lt 3 ] echo Y || echo NY[rootserver ~]# [ -d /opt/testdir ] || mkdir /opt/testdir #判断若目录不存在则创建目录二、if 判断语句单/双/多分支2.1 单分支 if条件成立返回值为0则执行不成立不执行。if条件测试;then命令序列fi案例目录不存在则创建#!/bin/bashdir/hahaif[!-d$dir];thenmkdir$dirfi案例判断是否为 root 用户#!/bin/bashif[$UID-eq0];thenecho当前登录系统用户为 rootfi2.2 双分支 if条件成立执行序列1否则执行序列2。if条件测试;then命令序列1else命令序列2fi案例ping 检测主机连通性#!/bin/bashping-c4-i0.2-W1$1/dev/nullif[$?-eq0];thenecho$1通了elseecho$1不通fi这里 /dev/null2.3 多分支 if多条件匹配匹配即停止。if条件1;then命令1elif条件2;then命令2else默认命令fi案例成绩等级判断#!/bin/bashread-p请输入您要检测的成绩[0-100]scoreif[$score-lt0]||[$score-gt100];thenecho您输入的成绩有误请重新输入[0-100]elif[$score-ge90];thenecho优秀elif[$score-ge80];thenecho良好elif[$score-ge70];thenecho一般elif[$score-ge60];thenecho及格elseecho不及格fi三、for 循环列表式 C 语言风格3.1 列表式 for 循环遍历值列表重复执行命令。for变量in值列表do要执行的命令donefor的作用是逐个遍历 in 后面的值列表。for后会跟一个变量值列表中的数据会赋值给这个变量。每一次循环都会把值列表下一个元素赋值给这个变量执行 do~done 里的命令序列命令序列中通过 $变量 引用当前这个元素案例1批量创建用户#!/bin/bashforiinjames paul belladouseradd$iecho123456|passwd--stdin$idone案例2从文件读取用户批量创建#!/bin/bashforiin$(cat/opt/user.txt)douseradd$iecho123456|passwd--stdin$idone3.2 C 语言风格 for 循环for((初值;条件;自增/减))do要执行的命令done案例31~100 求和#!/bin/bashsum0for((i1;i100;i))dosum$[sumi]doneecho123...100的整数之和为:$sum案例4批量 ping 网段#!/bin/bashfor((i1;i10;i))doping-c4-i0.2-W1192.168.8.$i/dev/nullif[$?-eq0];thenecho192.168.8.$i通了elseecho192.168.8.$i不通fidone四、while 循环4.1 基础语法条件成立则循环:表示恒成立死循环。while条件测试do命令序列done4.2 案例1批量创建规律用户#!/bin/bashi1while[$i-le5]douseraddtestuser$iecho123456|passwd--stdintestuser$ii$[i1]done4.3 案例2循环判断成绩输入 quit 退出#!/bin/bashwhile:doread-p请输入您要检测的成绩[0-100]scoreif[$scorequit];thenechoBye~exitelif[$score-lt0]||[$score-gt100];thenecho您输入的成绩有误请重新输入[0-100]elif[$score-ge90];thenecho优秀elif[$score-ge80];thenecho良好elif[$score-ge70];thenecho一般elif[$score-ge60];thenecho及格elseecho不及格fidone五、Shell 随机数$RANDOM5.1 随机数基础Shell 内置随机数变量$RANDOM生成 1~10 随机数$[RANDOM % 10 1]echo$RANDOMecho$[RANDOM%101]5.2 实战猜数字游戏#!/bin/bashnum$[RANDOM%101]while:doclearread-p请输入您猜的数字【1-10】: guessif[$guess-eq$num];thenecho恭喜您猜对了exitelif[$guess-gt$num];thenecho很遗憾猜大了elseecho很遗憾猜小了fisleep1done六、全文核心总结条件测试掌握[ ]语法、空格规范、$?返回值规则四类判断字符串-z/-n//!整数-eq/-ne/-gt/-lt/-ge/-le文件-e/-d/-f/-r/-w/-x多条件与、||或、;顺序执行if 判断单分支、双分支、多分支全覆盖循环for列表遍历、C 风格计数while条件循环、死循环随机数$RANDOM实现随机场景可做小游戏/批量随机任务
返回列表