当前位置: 首页 > news >正文

# 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 提供两种条件测试写法,[ ]为最常用写法

  • 方式1:test 命令(几乎已经不再使用)
    • test 选项 参数
  • 方式2:[ ] 写法(推荐)
    • [ 选项 参数 ]

强制规范[ ]内侧左右必须各留至少一个空格,否则语法报错。


1.3字符串比较

单字符串判断(空/非空)
[操作符 字符串]
  • -z:判断字符串为空,成立返回0,失败返回非 0
  • ! -z(注意!与-z之间的空格):判断字符串非空,等价于-n(不建议使用)
    (-n虽然与!z等价,但是-n使用起来注意事项较多,更建议使用!z)
[root@server ~]# [ -z abc ] #判断字符串abc是空的,失败/错误(注意:不加$代表只是普通的字符串而不是变量,字符串当然不是空的)[root@server ~]# echo $? #查看返回值为非01[root@server ~]# [ -n abc ] #判断字符串abc是非空的,成功/正确[root@server ~]# echo $? #查看返回值为00[root@server ~]# name=zhangsan #定义变量name,值为zhangsan[root@server ~]# [ -z "$name" ] #判断变量$name的值是空的,失败/错误[root@server ~]# echo $? #查看返回值为非01
双字符串比较:
[字符串1 操作符 字符串2]
  • ==:两个字符串相同
  • !=:两个字符串不相同
[root@server ~]# [ abc == haha ] #判断两个字符串相同,失败/错误[root@server ~]# echo $? #查看返回值为非0[root@server ~]# [ abc == abc ] #判断两个字符串相同,正确/成功[root@server ~]# echo $? #查看返回值为0[root@server ~]# name=lisi #定义变量name,值为lisi[root@server ~]# [ lisi == $name ] #判断lisi和name变量值相同,正确/成功[root@server ~]# echo $? #查看返回值为0[root@server ~]# class=cloud #定义变量class,值为cloud[root@server ~]# [ $class == $name ] #判断两个变量值相同,正确/成功[root@server ~]# echo $? #查看返回值为01

1.4整数比较

整数比较操作符
[整数值1 操作符 整数值2]

基础示例
[root@server ~]# [ 3 -eq 3 ][root@server ~]# echo $?0[root@server ~]# [ 3 -eq 8 ][root@server ~]# echo $?1[root@server ~]# [ 5 -lt 20 ][root@server ~]# echo $?0[root@server ~]# [ 5 -lt 2 ][root@server ~]# echo $?1

建议这样简化操作步骤:
[ a 操作符 b ] && echo $?

这里仅仅是基础演示写的较为繁琐一些

变量与命令结果比较
  • 整数比较支持变量比较、也支持对表达式的运行结果比较
[root@server ~]# age=18 #定义变量age,值为18[root@server ~]# [ $age -eq 30 ] #判断age变量的值等于30,失败/错误[root@server ~]# echo $? #返回值结果为非0[root@server ~]# ps aux | wc -l #统计系统进程数量[root@server ~]# [ $(ps aux | wc -l) -ge 100 ] #判断系统进程数量大于100[root@server ~]# echo $? #查看返回值

1.5文件状态测试

[操作符 文件/目录]

(重点是前三个选项)

  • 注意:-d,-f也可以确认文件是否存在
    • [ -f 文件名 ]文件存在 且 是普通文件
    • [ -d 目录名 ]目录存在 且 是目录
      因此-f/-d可以直接用来判断文件/目录是否存在
[root@server ~]# [ -e /etc ] #判断/etc存在[root@server ~]# echo $? #返回0[root@server ~]# [ -e /etc/hosts ] #判断/etc/hosts存在[root@server ~]# echo $? #返回0[root@server ~]# [ -f /etc ] #判断/etc存在且是文件[root@server ~]# echo $? #返回非0[root@server ~]# [ -f /etc/hosts ] #判断/etc/hosts存在且是文件[root@server ~]# echo $? #返回0[root@server ~]# [ -d /etc ] #判断/etc存在且是目录[root@server ~]# echo $? #返回0[root@server ~]# [ -d /etc/hosts ] #判断/etc/hosts存在且是目录[root@server~]# echo $? #返回非0

注意:权限判断中判断的是当前用户相对的权限


1.6多条件组合(&&/||/;

  • 主要用法
    • [ 条件1 ] 操作符 [ 条件2 ]
    • 命令1 操作符 命令2
逻辑符含义

  • ;:前命令执行完,继续执行后命令(不管前一条成功还是失败,无条件执行下一条)
  • &&:逻辑与,都成立才为真。前一条执行成功,才执行后一条;前一条失败,直接终止不往后跑。
  • ||:逻辑或,一个成立即为真。前一条失败了,才执行后一条;前一条如果成功,就不执行后面。
常用示例
  • 验证逻辑与&&和逻辑或||
[root@server ~]# [ $USER == root ] && [ $UID -eq 0 ] #判断当前用户为root且UD为0,正确[root@server ~]# echo $? #查看返回值为0[root@server ~]# [ $HOME == /home/root ] || [ $USER == root ] #判断及目录为/home/root或当前用户为root[root@server ~]# echo $? #查看返回值为0
  • 使用控制符组合多个命令
[root@server ~]# head -1 /etc/shells ; hostname #执行完命令1,再执行命令2[root@server ~]# [ a == a ] && echo Y || echo NY[root@server ~]# [ a == b ] && echo Y || echo NN[root@server ~]# [ 3 -eq 3 ] && echo Y || echo NY[root@server ~]# [ 2 -lt 3 ] && echo Y || echo NY[root@server ~]# [ -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"当前登录系统用户为 root"fi

2.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/null

2.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要执行的命令done
  • for的作用是逐个遍历 in 后面的值列表。for后会跟一个变量,值列表中的数据会赋值给这个变量。每一次循环,都会:
    • 把值列表下一个元素赋值给这个变量
    • 执行 do~done 里的命令序列
    • 命令序列中通过 $变量 引用当前这个元素

案例1:批量创建用户

#!/bin/bashforiinjames paul belladouseradd$iecho123456|passwd--stdin$idone

案例2:从文件读取用户批量创建

#!/bin/bashforiin$(cat/opt/user.txt)douseradd$iecho123456|passwd--stdin$idone

3.2 C 语言风格 for 循环

for((初值;条件;自增/))do要执行的命令done

案例3:1~100 求和

#!/bin/bashsum=0for((i=1;i<=100;i++))dosum=$[sum+i]doneecho"1+2+3+...+100的整数之和为:$sum"

案例4:批量 ping 网段

#!/bin/bashfor((i=1;i<=10;i++))doping-c4-i0.2-W1192.168.8.$i&>/dev/nullif[$?-eq0];thenecho"192.168.8.$i通了"elseecho"192.168.8.$i不通"fidone

四、while 循环

4.1 基础语法

条件成立则循环,:表示恒成立(死循环)

while条件测试do命令序列done

4.2 案例1:批量创建规律用户

#!/bin/bashi=1while[$i-le5]douseraddtestuser$iecho123456|passwd--stdintestuser$ii=$[i+1]done

4.3 案例2:循环判断成绩(输入 quit 退出)

#!/bin/bashwhile:doread-p"请输入您要检测的成绩[0-100]:"scoreif[$score==quit];thenecho"Bye~"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 随机数($RANDOM)

5.1 随机数基础

  • Shell 内置随机数变量:$RANDOM
  • 生成 1~10 随机数:$[RANDOM % 10 + 1]
echo$RANDOMecho$[RANDOM%10+1]

5.2 实战:猜数字游戏

#!/bin/bashnum=$[RANDOM%10+1]while:doclearread-p"请输入您猜的数字【1-10】: "guessif[$guess-eq$num];thenecho"恭喜您!猜对了"exitelif[$guess-gt$num];thenecho"很遗憾,猜大了!"elseecho"很遗憾,猜小了!"fisleep1done

六、全文核心总结

  1. 条件测试:掌握[ ]语法、空格规范、$?返回值规则
  2. 四类判断
    • 字符串:-z/-n/==/!=
    • 整数:-eq/-ne/-gt/-lt/-ge/-le
    • 文件:-e/-d/-f/-r/-w/-x
    • 多条件:&&(与)、||(或)、;(顺序执行)
  3. if 判断:单分支、双分支、多分支全覆盖
  4. 循环
    • for:列表遍历、C 风格计数
    • while:条件循环、死循环
  5. 随机数$RANDOM实现随机场景,可做小游戏/批量随机任务
http://www.jsqmd.com/news/722593/

相关文章:

  • [Al+」数智升级,品牌种草营销新范式
  • 2026年3月评价高的钻攻机供应厂家推荐,多米钻攻一体机/圆管钻孔攻牙机/五轴钻床/数控钻攻一体机,钻攻机厂家哪家强 - 品牌推荐师
  • GKMLT通讯工具箱(WPF MVVM) - 02-Modbus RTU 与 TCP 报文格式、原理与CRC校验
  • 高并发场景下委托内存暴增?C# 13三大优化机制(静态委托缓存、目标弱引用、结构化闭包)全公开(仅限.NET 8.0+)
  • 大数据开发场景下,总结并翻译 Oracle 中常见的错误(补充其他错误码:适合初学者)
  • IG502边缘网关:空压机预测性维护的轻量化方案
  • 如何彻底解决电脑风扇噪音?Fan Control终极指南帮你实现静音与散热的完美平衡
  • 揭秘书匠策AI:论文降重与AIGC防御的“独门秘籍”
  • Figma设计自动化:用rules-figma实现设计规范检查与团队协作提效
  • 2026年正宗新会陈皮排行:3个合规品牌的硬参数对比 - 优质品牌商家
  • 视频数据集安全防护:基于聚类的智能防泄漏方案
  • ARMv9内存管理:PAR_EL1寄存器详解与应用
  • Go 语言从入门到进阶 | 第 22 章:日志与可观测性
  • 收藏必备!小白程序员轻松掌握RAG大模型,让你的AI秒懂公司文档!
  • 仅剩72小时!.NET 9正式版边缘部署黄金窗口期关闭前,必须完成的5项Runtime裁剪与符号剥离操作
  • Unity游戏实时翻译终极指南:XUnity.AutoTranslator深度技术解析
  • Python金融数据获取革命:efinance如何成为量化交易的最佳数据助手
  • 新联合众香港展会圆满落幕,AI融合硬件矩阵获全球瞩目
  • ARM MPAM内存带宽控制机制详解与配置实践
  • 服务器3个设置需配置好!王杨游戏蜘蛛养站系统seo站长要做的!
  • 天辛大师再谈人工智能时代,一人公司真的符合社会学演进规律吗
  • journalctl -xe -u k3s 命令详解
  • 为什么92%的PHP团队低估了PHP 8.9的类型校验强度?——基于Zend Engine v4.9.0源码级行为对比分析
  • TVA在新能源汽车制造与检测中的实践与创新(3)
  • ARM架构Hypervisor调试机制与安全隔离实践
  • .NET 9云原生迁移倒计时:仅剩120天——.NET 6 LTS终止支持前必须完成的5项容器化加固动作
  • 算法终极审判:软件测试从业者的专业视角
  • HiClaw 1.1.0:企业级 Agent 开发的基建升级
  • 2026年广州名贵补品回收门店排行及选购推荐 - 优质品牌商家
  • 前端性能优化:构建工具优化详解