恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Shell 判断与循环
首页
资讯中心
/
Shell 判断与循环
Shell 判断与循环
发布时间:2026/10/11 8:02:24
Shell 判断与循环语句详解一、判断语句1.if语句基本语法if[条件];then# 条件为真时执行fi完整语法if[条件1];then# 条件1为真elif[条件2];then# 条件2为真else# 都不满足fi示例#!/bin/bashread-p请输入分数: scoreif[$score-ge90];thenecho优秀elif[$score-ge60];thenecho及格elseecho不及格fi嵌套 ifif[条件1];thenif[条件2];thenecho条件1和条件2都满足fifi2.case语句语法case$变量in模式1)命令;;模式2|模式3)命令;;*)默认命令;;esac示例#!/bin/bashread-p请输入 yes/no: answercase$answerinyes|Y|y)echo你选择了是;;no|N|n)echo你选择了否;;*)echo输入无效;;esac服务管理脚本示例#!/bin/bashcase$1instart)systemctl start nginx;;stop)systemctl stop nginx;;restart)systemctl restart nginx;;status)systemctl status nginx;;*)echo用法:$0{start|stop|restart|status}exit1;;esac3. 条件测试3.1 数值比较运算符含义-eq等于-ne不等于-gt大于-lt小于-ge大于等于-le小于等于if[$a-gt$b];thenechoa bfi3.2 字符串比较运算符含义或相等!不相等-z为空-n非空if[$namezzw];thenecho匹配fiif[-z$name];thenechoname 为空fi3.3 文件测试运算符含义-e存在-f是普通文件-d是目录-r可读-w可写-x可执行-s非空-L是符号链接if[-f/etc/passwd];thenecho文件存在fiif[-d/var/log];thenecho目录存在fi3.4 逻辑运算运算[ ][[ ]]与-a或-o||非!!# [ ][-f$file-a-r$file]echo存在且可读# [[ ]][[-f$file-r$file]]echo存在且可读二、循环语句1.for循环语法一列表遍历for变量in列表;do命令done示例foriin12345;doecho$idonefornameinalice bob charlie;doechoHello,$namedone语法二范围foriin{1..10};doecho$idoneforiin{1..10..2};do# 步长 2echo$idone语法三C 风格for((i1;i10;i));doecho$idone语法四遍历文件forfilein*.txt;doecho处理:$filedone语法五遍历命令输出foruserin$(cat/etc/passwd|cut-d:-f1);doecho用户:$userdone实战批量创建用户#!/bin/bashforuserinuser1 user2 user3;doifid$user/dev/null;thenecho$user已存在elseuseradd$userecho123456|passwd--stdin$userecho$user创建成功fidone2.while循环语法while[条件];do命令done条件为真时循环为假时退出。示例#!/bin/bashi1while[$i-le5];doecho$i((i))done读取文件#!/bin/bashwhilereadline;doecho行:$linedonefile.txt无限循环whiletrue;doecho按 CtrlC 退出sleep1done实战监控服务状态#!/bin/bashwhiletrue;doif!systemctl is-active--quietnginx;thenecho$(date): nginx 挂了重启中...systemctl restart nginxfisleep10done3.until循环语法until[条件];do命令done和while相反条件为假时循环为真时退出。示例#!/bin/bashi1until[$i-gt5];doecho$i((i))done等价于i1while[$i-le5];doecho$i((i))done4.break和continuebreak跳出循环foriin{1..10};doif[$i-eq5];thenbreak# 到 5 就退出fiecho$idone# 输出1 2 3 4continue跳过本次foriin{1..5};doif[$i-eq3];thencontinue# 跳过 3fiecho$idone# 输出1 2 4 5break N跳出多层循环foriin{1..3};doforjin{1..3};doif[$j-eq2];thenbreak2# 跳出两层fiecho$i-$jdonedone5.select循环语法select变量in列表;do命令done自动生成菜单用户选择后执行。示例#!/bin/bashPS3请选择操作: selectoptinstart stop restart status quit;docase$optinstart)echo启动服务;;stop)echo停止服务;;restart)echo重启服务;;status)echo查看状态;;quit)break;;*)echo无效选择;;esacdone运行效果1) start 2) stop 3) restart 4) status 5) quit 请选择操作:三、实战综合示例1. 批量 Ping 测试#!/bin/bashforipin10.1.8.{1..254};doping-c1-W1$ip/dev/nullecho$ip在线donewait2. 磁盘监控告警#!/bin/bashTHRESHOLD80df-h|grep-vFilesystem|whilereadline;dousage$(echo$line|awk{print $5}|seds/%//)mount$(echo$line|awk{print $6})if[$usage-gt$THRESHOLD];thenecho警告:$mount使用率$usage%fidone3. 自动备份脚本#!/bin/bashBACKUP_DIR/backupDATE$(date%Y%m%d)SOURCE/var/wwwfordirin$SOURCE/*;doif[-d$dir];thenname$(basename$dir)tar-czvf${BACKUP_DIR}/${name}_${DATE}.tar.gz$dirif[$?-eq0];thenecho备份成功:$nameelseecho备份失败:$namefifidone# 删除 7 天前的备份find$BACKUP_DIR-name*.tar.gz-mtime7-delete4. 服务健康检查#!/bin/bashSERVICESnginx mysql redisforsvcin$SERVICES;doifsystemctl is-active--quiet$svc;thenecho$svc: 运行中elseecho$svc: 已停止尝试启动...systemctl start$svcif[$?-eq0];thenecho$svc: 启动成功elseecho$svc: 启动失败fifidone5. 用户管理菜单#!/bin/bashPS3请选择操作: selectoptin添加用户删除用户查看用户退出;docase$optin添加用户)read-p请输入用户名: usernameifid$username/dev/null;thenecho用户已存在elseuseradd$usernameecho用户创建成功fi;;删除用户)read-p请输入用户名: usernameuserdel-r$username2/dev/nullecho删除成功||echo删除失败;;查看用户)cut-d:-f1/etc/passwd;;退出)break;;esacdone四、常见错误与注意事项错误说明正确写法if[if和[之间没空格if [[ $a $b ]变量没加引号[ $a $b ][ $a x ][ ]中不标准[ $a x ]-o用在[[ ]][[ ]]不支持-o用||两边没空格被当成字符串[[ $a x ]]for i in {1..10}某些 Shell 不支持用$(seq 1 10)while read line不读最后一行文件末尾无换行用while read line || [ -n $line ]五、一句话总结判断if、case循环for、while、until、select控制break、continue结构用途if条件判断case多值匹配for遍历列表while条件循环until反向条件循环select生成菜单break跳出循环continue跳过本次记住if和[之间有空格变量加引号[[ ]]比[ ]更安全。