Bash脚本多xls文件转换报binary operator expected错误修复
错误根因
报错来自脚本中test -f /home/doc/testy/*.xls这一行:
当目录下存在2个及以上.xls文件时,bash会将通配符*.xls展开为多个空格分隔的文件路径,最终传给test -f的参数数量超过2个。而test命令的-f运算符仅支持接收1个文件路径作为校验对象,参数不符合语法规则时就会抛出binary operator expected错误。
除此之外该写法还有逻辑漏洞:如果目录下没有任何.xls文件,通配符不会触发展开,test -f会直接校验字面量路径/home/doc/testy/*.xls,该路径必然不存在,虽然不会触发报错,但属于无效判断。
修复后脚本
#!/bin/bash while true do for f in /home/doc/testy/*.xls; do # 校验当前对象为真实存在的普通文件,跳过无匹配时的通配符字面量 [ -f "$f" ] || continue ssconvert "$f" "${f%.xls}.xlsx" chown www-data:www-data "${f%.xls}.xlsx" rm -f -- "$f" done sleep 10 done
改动说明
- 删除了原脚本中前置的通配符存在性判断,从根源避免多文件场景下参数过多的语法错误
- 在for循环内部增加单文件校验:当通配符未匹配到任何xls文件时,循环会拿到字面量
/home/doc/testy/*.xls,此时校验不成立会直接跳过,不会执行后续无效操作 - 全量路径参数保留双引号包裹,兼容文件名包含空格、特殊字符的场景
- 原有轮询间隔、格式转换、属主修改、原文件删除的业务逻辑完全不变,不会影响原有功能
内容的提问来源于stack exchange,提问作者Artem Mayer
相关产品推荐
相关产品推荐

