bash: ((: ave=total/numLines : 除以 0(错误标记为 "numLines ")

bash: ((: ave=total/numLines : division by 0 ( error token is "numLines ")

我正在编写 bash 脚本,但我收到此错误:

bash:  ((: ave=total/numLines : division by 0 (error token is "numLines ")

这是我的代码:

total="$( cut -d '|' -f ${array[$index]} folder/${files[$x]} | awk '{ sum +=  } END { print sum }' )"

numLines="$( cut -d '|' -f ${array[$index]} folder/${files[$x]} | awk 'NF' | wc -l )"

(( ave=total/numLines ))

可以正确计算和打印变量 'ave' 的值,但我一直收到 'division by 0' 错误。我一开始尝试给 'numLines' 赋值,但似乎没有用。

出了什么问题,我该如何解决?

基于@Barmar 和我的评论:

AWK可以提取不同分隔符的字段(不需要cut):

read -r total ave <<< "$(awk -F '|' -v field=${array[$index]} 'NF { sum += $field; count++ } END {print sum, sum/count}' "folder/${files[$x]}")"

请注意,在 sum += $field 中,美元符号导致变量 field 中保存的字段编号引用该字段的内容。 (它不是 Bash 中使用的变量名称。) -v 参数是将 Bash 变量作为 AWK 变量传递给 AWK 的方法。此处使用的模式 (NF) 匹配所有非空行并且操作包含在 {} 中。 END 模式很特殊,当所有输入都被消耗时执行。