linux中for循环遍历列表依赖空格分隔的值展开,不依赖计数器;支持显式列举、通配符匹配、命令替换、花括号序列四种方式,需注意引号保护、nullglob设置及避免$(ls)等不可靠用法。

Linux 中用 for 循环遍历列表数据,核心就是把一组值(字符串、数字、文件名等)按空格分隔后依次赋给变量,再执行命令。它不依赖计数器,而是靠“展开列表”来驱动,写法简洁、用途广泛。
基础写法:显式列出值
最直接的方式是把要处理的项直接写在 in 后面,用空格分隔:
for name in Alice Bob Charlie; do echo "Hello $name"; done- 注意:每个值之间必须有空格;含空格的值要用引号括起来,比如
"file name.txt" - 变量名(如
name)只在循环内有效,但最后一次赋值会保留在循环外
用通配符匹配文件名
这是运维中最常见的场景,比如批量处理日志或脚本文件:
-
for f in *.log; do gzip "$f"; done—— 压缩当前目录所有 .log 文件 - 如果没匹配到任何文件,
*.log会原样保留为字符串,可能导致意外行为;加shopt -s nullglob可让无匹配时列表为空 - 推荐始终用双引号包裹变量:
"$f",防止文件名含空格或特殊字符时报错
从命令输出生成列表
用 $(...) 或反引号把命令结果当作列表源:
for user in $(cut -d: -f1 /etc/passwd | head -3); do echo "User: $user"; done- 注意:命令替换结果按空白(空格、制表符、换行)分割,若原始输出含空格(如用户名带空格),可能出错;此时更适合用
while read - 避免用
for file in $(ls)——ls输出不可靠,应优先用通配符for file in *
用花括号生成数字或字母序列
Bash 4.0+ 支持简洁的范围展开,适合计数类任务:
-
for i in {1..5}; do echo "Step $i"; done→ 输出 1 到 5 -
for day in {Mon..Fri}; do echo "$day"; done→ 输出 Mon Tue Wed Thu Fri(需 locale 支持) - 支持步长:
{1..10..2}表示 1 3 5 7 9 - 这种写法是 shell 展开,不是运行时计算,不能用变量替代边界,如
{1..$n}不生效











