数组未将值传递给for循环

时间:2016-05-04 03:48:56

标签: arrays unix for-loop

我有如下代码,Array没有将值传递给for循环。

echo "rops is ${rops[*]}"
for i in ${rops[*]}
do
if [[ ${rops[i]} == 4000 ]]; then
echo "issue there"
 fi
 done

以下是在调试模式下运行的脚本

+ echo 'rops is 931
  32
 32'
 rops is 931
  32
   32
 + for i in '${rops[*]}'
   + [[ '' == 4000 ]]
  + for i in '${rops[*]}'
   + [[ '' == 4000 ]]
  + for i in '${rops[*]}'
  + [[ '' == 4000 ]]

-Thanks。

1 个答案:

答案 0 :(得分:0)

问题是i包含数组中的值,而不是数组的索引。

也就是说,第一次i931,然后是32,然后是31,但您没有元素${rops[931]}${rops[32]}${rops[31]},因此shell会为您提供一个空字符串作为${rops[i]}的值(无论如何都应为${rops[$i]})。因此,shell有多种原因可以解决它的问题。

rops=(931 32 31)
echo "rops is ${rops[*]}"
for i in ${rops[*]}
do
    echo "i = $i"
    if [[ "${rops[$i]}" == 4000 ]]; then
        echo "issue there"
    fi
done

使用bash运行时,会产生:

rops is 931 32 31
i = 931
i = 32
i = 31

间距的差异表明你没有像这段代码那样初始化数组;你以某种方式获得了与数组元素相关的换行符。

使用符号for i in ${rops[*]}(或for i in "${rops[@]}",这在多个级别上更好 - 尝试使用值中有空格的数组元素来查看原因)给出数组中的元素。如果您真的想要索引,则需要阅读arrays上的Bash手册并使用:

rops=(931 32 31)
echo "rops is ${rops[*]}"
echo "indexes are ${!rops[*]}"
for i in "${!rops[@]}"
do
    echo "i = $i; rops[$i] = ${rops[$i]}"
    if [[ "${rops[$i]}" == 4000 ]]; then
        echo "issue there"
    fi
done

示例输出:

rops is 931 32 31
indexes are 0 1 2
i = 0; rops[0] = 931
i = 1; rops[1] = 32
i = 2; rops[2] = 31