4

可能重复:
Bash:无法在管道右侧构建数组

我需要从文件创建一个数组。我必须计算一个索引来存储数据。当我离开我的读取循环时,我的数组似乎消失了。为什么???

下面的脚本说明了这个问题。

#!/bin/bash

echo -e "15\n21\n33" | while read i ; do
    ar[$i]="set"
    echo ${!ar[@]}
    echo ${ar[@]}
  done

echo
echo outside loop:  
echo ${!ar[@]} 
echo ${ar[@]} 

正如您在输出中看到的,打印数组索引和内容不再在循环之外工作。

15
set
15 21
set set
15 21 33
set set set

outside loop:
4

1 回答 1

6

@ormaaj 在他的评论中有答案:不要将循环放在管道中。我假设这些数字不是恒定的,所以从进程替换重定向:

while read i ; do
    ar[$i]="set"
    echo ${!ar[@]}
    echo ${ar[@]}
done < <(process to generate indices) 

另一种选择是将最终的 echo 语句放在与循环相同的子 shell 中:

process to generate indices | {
    while read i ; do
        ar[$i]="set"
        echo ${!ar[@]}
        echo ${ar[@]}
    done

    echo
    echo outside loop:  
    echo ${!ar[@]} 
    echo ${ar[@]} 
}
于 2012-10-26T20:45:06.520 回答