news 2026/4/30 2:32:24

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
# 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实现随机场景,可做小游戏/批量随机任务
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 2:26:22

急缺大模型开发!年薪96万的新兴领域,强烈建议冲一冲!

本文强调AI大模型技术作为未来五年程序员最佳发展方向&#xff0c;指出华为、美团、阿里等大厂都在积极布局相关岗位&#xff0c;年薪百万成为常态。文章指出&#xff0c;掌握AI大模型技术&#xff0c;特别是Fine-tuning、Agent、RAG等技术&#xff0c;对于开发者的职业发展至关…

作者头像 李华
网站建设 2026/4/30 2:25:23

TVA在新能源汽车制造与检测中的实践与创新(1)

重磅预告&#xff1a;本专栏将独家连载新书《AI视觉技术&#xff1a;从入门到进阶》精华内容。本书是《AI视觉技术&#xff1a;从进阶到专家》的权威前导篇&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan师从美国三院院士、“AI教母”…

作者头像 李华
网站建设 2026/4/30 2:15:53

纳米无人机自主导航:计算优化与传感器融合实践

1. 纳米无人机自主导航的技术挑战与解决方案在资源受限的纳米无人机&#xff08;通常指重量小于50克、计算能力低于100mW的微型飞行器&#xff09;上实现自主导航&#xff0c;面临着传统无人机领域未曾遇到的极端约束条件。以Crazyflie 2.1为例&#xff0c;这款仅27克的纳米无人…

作者头像 李华
网站建设 2026/4/30 2:14:59

AI语言中立化技术如何优化全球客服中心运营

1. 语言中立化技术如何重塑客服中心在全球化商业环境中&#xff0c;客服中心每天需要处理来自不同语言背景的海量客户咨询。传统解决方案通常依赖多语种客服团队或外包翻译服务&#xff0c;但这些方法存在响应延迟、成本高昂和沟通失真等问题。根据实际运营数据&#xff0c;采用…

作者头像 李华
网站建设 2026/4/30 2:11:23

厦门雅思机构哪家性价比高

在厦门&#xff0c;选择一家合适的雅思培训机构&#xff0c;往往让家长和学生感到头疼。价格高低、师资真假、课程是否适合自己……这些因素交织在一起&#xff0c;让人难以抉择。作为一名在集美大学城附近生活了多年的家长&#xff0c;我亲眼见证了身边不少孩子通过不同机构备…

作者头像 李华