ZSH脚本遍历文件时count计数变量仅递增一次问题排查
问题根因
你遇到的计数异常核心原因是LOOP变量没有被定义为数组类型,只是普通的字符串变量:
- 你用
LOOP=$(ls 2021/*.xlsx)的写法,会把ls输出的所有文件名拼接成一个整字符串赋值给LOOP - 后续
for FILE in ${LOOP[@]}遍历的时候,整个字符串只会被识别为1个元素,所以循环仅执行1次,count自然只递增1次 - 你看到的多行文件名输出,是单次循环里
echo $FILE打印了包含所有文件名的整字符串,换行是ls输出自带的,不是循环多次执行的结果
修复方案
不要用ls获取文件列表(容易受文件名特殊字符、空格等影响),直接用zsh的glob匹配生成数组即可,修改后的代码如下:
#!/bin/zsh # 直接用glob匹配生成文件名数组,避免ls的各种问题 LOOP=(2021/*.xlsx) # 直接取数组长度作为总文件数,不用wc计算更准确 totalFiles=${#LOOP[@]} directoryCount=0 count=0 for FILE in ${LOOP[@]}; do echo "BEFORE: $count" count=$((count+1)) echo "AFTER: $count" echo $FILE done echo "TOTAL FILE: $totalFiles" echo $count
修改后循环会按实际文件数执行,count最终会等于totalFiles的数值4,符合你的预期。
内容的提问来源于stack exchange,提问作者Tanner Priest
相关产品推荐
相关产品推荐

