即使达到极限,条件也不会成真

时间:2012-02-13 09:24:17

标签: bash

以下表达式有什么问题:

...
if [ $i -ge ${tLen} ]; then
     echo "Maximum limit reached, i=$i"
fi
i=$(($i+1))
...

此表达式位于while循环内。 i是计数器变量,其初始值为0。 tLen存储数组的长度,我正在遍历。 即使true达到i,此条件也不会tLen。我哪里错了?

这是我的完整代码:

read filename
words=(5 2)
i=0
sed 's/ /\n/g' "$filename" >"tmp.txt"
while read word
do
  words[i]=$word
  i=$(($i+1))
  awk "/$word/ {count += 1} END{print count}" "tmp.txt" >>"tmp2.dat"
done <"tmp.txt"
i=0
tLen=${#words[@]}
echo "Length of words: ${tLen}"
declare -A wordMap
while read count
do
  if [ $i -ge ${tLen} ]; then
    echo "Maximum length reached, i=$i"
    break
  fi
  wordMap["${words[$i]}"]=$count
  i=$(($i+1))
done <"tmp2.dat"

rm "tmp.txt"
rm "tmp2.dat"

实际上我正在尝试计算给定文本中每个单词的频率......

2 个答案:

答案 0 :(得分:0)

这不是“真实”问题的答案,但如果您只想实际计算文件中的单词:

sed 's/[[:space:][:punct:]]/\n/g;' < testfil | sed '/^$/d' | sort -f | uniq -ci | sort -n

似乎有效。

否则我无法在代码中看到错误,尤其是在最小示例中。尝试在代码的早期插入调试echo语句或设置set -x,以获得模拟行为的最小示例。

答案 1 :(得分:0)

对于包含空行或文字之间有多个空格的文本,代码会有问题。在那种情况下,行

wordMap["${words[$i]}"]=$count

会因bad array subscript消息而失败,因为${words[$i]}为空。