菜鸟科技网

Shell循环命令有哪些常见用法?

Shell命令中的循环结构是自动化任务处理的核心工具,通过重复执行特定代码块,显著提升工作效率,在Shell脚本中,常用的循环包括for循环、while循环和until循环,每种循环适用于不同的场景。

Shell循环命令有哪些常见用法?-图1
(图片来源网络,侵删)

for循环主要用于遍历列表或序列,其基本语法为“for 变量 in 列表; do 命令; done”,遍历文件列表并打印每个文件名:for file in *.txt; do echo "Processing $file"; done,这里的*.txt是通配符,匹配当前目录下所有.txt文件,for循环还支持C语言风格的语法,如for ((i=1; i<=5; i++)); do echo $i; done,适用于需要计数的场景。

while循环在条件为真时持续执行,语法为“while 条件; do 命令; done”,监控磁盘空间直到低于阈值:while [ $(df / | awk 'NR==2 {print $5}') -gt 80 ]; do echo "Disk usage high, waiting..."; sleep 30; done,该循环会每30秒检查一次磁盘使用率,直到低于80%才停止,需要注意的是,条件必须能最终变为假,否则会导致无限循环。

until循环与while循环相反,在条件为假时执行,语法为“until 条件; do 命令; done”,等待某个进程结束:until pgrep -x "nginx" > /dev/null; do echo "Nginx is not running, waiting..."; sleep 5; done,该脚本会每5秒检查一次nginx进程,直到检测到进程运行。

循环控制命令breakcontinue用于调整执行流程。break立即退出循环,而continue跳过当前迭代进入下一次循环,在遍历文件时遇到错误文件可跳过:for file in *; do if [ ! -f "$file" ]; then continue; fi; echo "Processing $file"; done

Shell循环命令有哪些常见用法?-图2
(图片来源网络,侵删)

循环中还可结合管道和重定向实现复杂操作,将日志文件按日期分割:while read line; do date=$(echo $line | awk '{print $1}'); mkdir -p "logs/$date"; echo $line >> "logs/$date/log.txt"; done < access.log,该脚本逐行读取日志文件,根据日期创建目录并存储对应内容。

以下是循环性能对比的简要表格:

循环类型 适用场景 执行效率 代码复杂度
for循环 已知列表或范围
while循环 条件驱动
until循环 条件驱动

在实际应用中,合理选择循环类型可显著提升脚本效率,处理固定数量的文件适合for循环,而等待某个事件发生则适合while或until循环。

相关问答FAQs

  1. 问:如何在循环中同时获取文件名和扩展名?
    答:可以使用参数扩展实现,for file in *; do filename="${file%.*}"; extension="${file##*.}"; echo "File: $filename, Extension: $extension"; done${file%.*}删除从后缀开始的第一个点及之后内容,${file##*.}删除最后一个点及之前内容。

  2. 问:如何避免循环中的变量作用域问题?
    答:使用local关键字在函数内定义局部变量,function loop_example() { local i; for i in {1..5}; do echo $i; done; },若在脚本中,变量默认为全局作用域,可通过unset在循环结束后清除变量。

分享:
扫描分享到社交APP
上一篇
下一篇