BASH脚本提交pbs到HPC时for循环Operand Error报错如何解决
问题根因
Bash的大括号展开({x..y}语法)执行优先级早于变量替换,因此{1.."$fnum"}中的$fnum在大括号展开阶段还未被替换为实际统计的文件数值,无法生成合法的数字序列,最终触发语法报错。
另外当前写法还有两个隐藏问题:
- Bash数组默认从
0开始索引,从1开始遍历会漏掉第一个匹配的pbs文件,且循环到$fnum时会出现数组越界 - 通配符无匹配文件时,会直接把通配符字符串当成数组元素,导致提交不存在的文件报错
- 原代码中
subm的赋值是冗余操作,直接引用数组元素即可,不需要经过echo中转
修复方案
直接改用支持变量的数组索引遍历即可,优化后的完整代码如下:
# 提前确认此处的$r变量已经正确赋值,否则通配符匹配会异常 for i in {1..3}; do cd "${i}" || continue # 避免目录不存在时误操作上级目录 files=(*_R"$r"_*.pbs) # 先判断是否存在匹配的文件,无匹配则跳过当前目录 [ -e "${files[0]}" ] || { cd ..; continue; } # 直接遍历数组所有索引,适配任意数量的匹配文件 for k in "${!files[@]}"; do qsub "${files[$k]}" done cd .. done
可选替代写法
如果你确实需要按数字序列遍历而非直接遍历数组索引,也可以用seq命令生成序列,写法如下:
# 序列从0开始,到文件总数减1结束,匹配数组索引规则 for k in $(seq 0 $(( ${#files[@]} - 1 )) ); do qsub "${files[$k]}" done
内容的提问来源于stack exchange,提问作者qaziqaziqazi
相关产品推荐
相关产品推荐

