shell for循环读取目录下csv文件报错的排查解决求助
问题原因
- 你混用了Windows批处理和Linux Shell的语法:你写的
for /r %%i是Windows批处理的专属写法,但你实际运行在Linux Shell(如Bash)环境中,两种环境语法不兼容,直接导致两个报错:$'/r' command not found:Shell中for命令没有/r参数,该参数是Windows批处理用来递归遍历目录的专属标识,Shell无法识别会将其当做独立命令尝试执行,触发该报错。Syntax Error near unexpected token '%%i':Windows批处理脚本中循环变量用双百分号%%i标识,但Shell中循环变量用$前缀标识,双百分号属于Shell无效语法,触发语法错误。
- 额外问题:你代码中
do "hello World" %%i里的"hello World"不是可执行命令,即使语法修正后运行也会报错,需要替换为你实际要执行的操作(比如打印文件名用echo,读取文件用cat等)。
解决方案
分两种运行环境给出对应正确代码:
环境1:Linux/Unix/macOS 运行(Bash环境)
仅遍历当前目录下的csv文件,不递归子目录
cd /tmp/Documents for i in *.csv; do # 替换下方echo行为你实际需要的操作 echo "处理文件:$i" done
递归遍历当前目录及所有子目录下的csv文件
推荐兼容性更高的find写法:
find /tmp/Documents -type f -name "*.csv" | while read -r i; do # 替换下方echo行为你实际需要的操作 echo "处理文件:$i" done
环境2:Windows 运行(批处理脚本)
如果是存为.bat/.cmd脚本文件运行,修正后代码:
echo on cd \tmp\Documents :: 替换下方echo为你实际需要执行的命令 for /r %%i in (*.csv) do echo "hello World" %%i
如果你是直接在CMD窗口手动输入命令运行,不需要存为脚本,循环变量要改为单百分号:
for /r %i in (*.csv) do echo "hello World" %i
内容的提问来源于stack exchange,提问作者Noor
相关产品推荐
相关产品推荐

