Unix下循环遍历多个文件报'FOR' is not matched错误求助
报错根因
你遇到的'FOR' is not matched报错由以下几个shell语法错误共同导致:
- 变量赋值语法不符合shell规范:shell中变量赋值的
=两侧绝对不能加空格,你写的FILE_NAME = {1}会被shell识别为执行FILE_NAME命令、传入=和{1}两个参数,根本不会完成变量赋值操作。 - for循环结构不完整:你只写了for循环的起始行,没有写循环体必需的
do开头、done结尾的闭合结构,shell解析到行尾找不到循环匹配标记,直接抛出匹配错误。 - 遍历逻辑存在隐患:通过反引号包裹
ls命令的输出做循环遍历是shell编写的典型反模式,遇到带空格、换行、特殊字符的文件名时会出现错误拆分。 - 注释写法不规范:行尾注释的
#前需要留空格,你写的{1}#is a .txt file会被shell整体识别为赋值给变量的内容,注释不会生效。
修复方案
根据你的实际使用场景选对应写法即可:
- 场景1:
FILE_NAME是文件名前缀,需要匹配所有对应前缀的txt文件
# 等号两侧无空格,注释前留空格 FILE_NAME={1} # 对应txt文件的前缀标识 # 直接用shell原生glob通配符遍历,自动兼容带特殊字符的文件名 for f in "${FILE_NAME}"*.txt do # 替换为你需要对每个文件执行的实际操作,以下为示例 echo "正在处理文件: $f" done
- 场景2:多个文件是启动脚本时作为参数传入的
# 直接遍历所有传入的脚本位置参数即可 for f in "$@" do # 替换为你需要对每个文件执行的实际操作 echo "正在处理文件: $f" done
额外排查点:如果你是在Windows系统编辑脚本后上传到Linux/macOS运行,需要检查脚本换行符是否为Windows默认的CRLF格式,CRLF换行符也会导致shell无法正确识别语法标记,这种情况执行
dos2unix 你的脚本文件路径转换为Unix标准的LF换行符即可正常运行。
内容的提问来源于stack exchange,提问作者Kartik
相关产品推荐
相关产品推荐

