4

我有两个要循环的数组。我正确地构造了它们,在进入 for 循环之前,我会回显它们以确保数组一切正常。但是当我运行脚本时,它会输出一个错误:

l<=: syntax error: operand expected (error token is "<="

我咨询了强大的谷歌,我知道它缺乏第二个变量,但我之前提到过我确实回应了这些值,一切似乎都很好。这是片段..

#!/bin/bash
    k=0
    #this loop is just for being sure array is loaded
    while [[ $k -le ${#hitEnd[@]} ]] 
      do
      echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
      # here outputs the values correct 
      k=$((k+1))
    done
    k=0
    for ((l=${hitStart[k]};l<=${hitEnd[k]};l++)) ; do //this is error line..
        let array[l]++      
        k=$((k+1))
done

for 循环中的变量已正确回显,但 for 循环不起作用..我错在哪里?

#

正如 gniourf_gniourf 回答的那样:

“...在某个时刻,k 将达到 ${#hitEnd[@]} 的值,而这正是没有定义 hitEnd[k] 并扩展为空字符串的时候!砰!”

意思是错误输出不是在循环开始时显示,而是当 k 的值大于数组的索引时,指向数组不包含的索引...

4

2 回答 2

4

那是因为在某些时候${hitEnd[k]}扩展为空(它是未定义的)。我得到同样的错误((l<=))。您应该将for循环编写为:

k=0
for ((l=${hitStart[0]};k<${#hitEnd[@]} && l<=${hitEnd[k]};l++)); do

以便始终具有k与数组中定义的字段相对应的索引${hitEnd[@]}

此外,而不是

k=$((k+1))

你可以写

((++k))

完毕!

您的脚本使用更好的现代 bash 实践进行了修改:

#!/bin/bash
k=0
#this loop is just for being sure array is loaded
while ((k<=${#hitEnd[@]})); do
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
    # here outputs the values correct 
    ((++k))
done
k=0
for ((l=hitStart[0];k<${#hitEnd[@]} && l<=hitEnd[k];++l)); do
    ((++array[l]))
    ((++k))
done

现在,我不太确定for循环是否完全符合您的要求...您不是说这个吗?

#!/bin/bash
# define arrays hitStart[@] and hitEnd[@]...
# define array array[@]

#this loop is just for being sure array is loaded
for ((k=0;k<${#hitEnd[@]};++k)); do
    echo "hitEnd is: ${hitEnd[k]} and hitStart is: ${hitStart[k]}"
    # here outputs the values correct 
    ((++k))
done

for ((k=0;k<${#hitEnd[@]};++k)); do
    for ((l=hitStart[k];l<=hitEnd[k];++l)); do
        ((++array[l]))
    done
done
于 2012-12-02T18:15:16.573 回答
1

有点创可贴,但是您将 for 循环重写为 while 循环:

l="${hitStart[k]}"
while [[ "$l" -le "${hitEnd[k]}" ]]; do
        let array[l]++      
        k=$((k+1))
        l=$((l+1))
done
于 2012-12-02T18:15:23.867 回答