Bash移动文件报integer expression expected错误如何解决
报错原因
- Bash 原生的数值比较运算符(
-gt/-lt/-eq等)仅支持整数类型对比,你脚本中需要对比的分辨率、阈值3.00都是浮点数,不符合整数要求,因此触发报错。 - 原脚本还存在潜在风险:用
ls *.ent遍历文件容易因文件名含特殊字符(空格、换行等)出错;未处理分辨率提取为空的边界场景,会导致后续比较逻辑异常。
可行解决方案
用支持浮点数比较的工具(如bc)替换原生bash比较逻辑,同时优化遍历和提取流程,修复后的脚本如下:
#!/bin/bash Above3="/mnt/d/Documents/Research/PhD/PhD/Research/Results/PDB/New/XRD/Above3" # 先确保目标目录存在,避免移动失败 mkdir -p "$Above3" # 直接用通配符遍历.ent文件,规避ls的兼容性问题 for f in *.ent; do # 提取分辨率,省略多余管道步骤 resolution=$(awk '/REMARK 2 RESOLUTION\./ {print $4}' "$f" | tr -d ' ') # 先判断分辨率是否提取成功,再用bc做浮点数比较 if [[ -n "$resolution" ]] && echo "$resolution > 3.00" | bc -l | grep -q 1; then mv -- "$f" "$Above3" fi done
优化说明
- 所有变量用双引号包裹,兼容带空格、特殊字符的文件名
- 增加空值判断,过滤提取不到分辨率的异常文件
- 用
bc -l做浮点数比较:当输入的比较表达式成立时bc输出1,否则输出0,匹配到1时才执行移动操作 - 增加
--参数适配以-开头的文件名,避免mv命令解析错误
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

