填充Bash数组失败

时间:2013-08-23 15:49:01

标签: bash loops while-loop

这是一个我在bash中运行的简单命令,但是数组赢了;因为某些原因填充了。

array=() && sudo iwlist wlan0 scan | grep 'Address'| while read line; do array[${#array[@]}]=$line; done

我也尝试过以这种方式填充数组:

array=()
sudo iwlist wlan0 scan | grep 'Address'| while read line; do array+=($line); done

但它给了我相同的结果。我知道它有效,因为当我这样做时:

sudo iwlist wlan0 scan | grep 'Address'| while read line; do "echo $line"; done

它将打印从grep传送到while循环的每一行。

当我检查数组的大小“echo $ {#array [@]”时,它将显示0,如果我打印数组,它显然什么都不打印。你看到线上有任何错误吗?

**更新。我通过使用像这样的for循环来实现它:

for line in $(sudo iwlist wlan0 scan | grep 'Address' -A5); do array+=($line); done

2 个答案:

答案 0 :(得分:3)

BASH FAQ#24:"I set variables in a loop that's in a pipeline. Why do they disappear after the loop terminates? Or, why can't I pipe data to read?"

  

while循环[...]在新的子shell中执行,并带有自己的变量副本[...]

使用以下方法解决方法:

while read line;
    do array+=("$line")
done < <(sudo iwlist wlan0 scan | grep 'Address')

答案 1 :(得分:1)

尝试使用流程替换:

array=()
while read line; do array+=($line); done < <(exec sudo iwlist wlan0 scan | grep 'Address')

或使用lastpipe选项:

shopt -s lastpipe
array=() && sudo iwlist wlan0 scan | grep 'Address'| while read line; do array[${#array[@]}]=$line; done

如果您使用Bash 4.0+,使用readarraymapfile也会更便宜。无需使用array初始化(),只有在以前在更全局的上下文中将其声明为其他类型时才需要重新声明。

readarray -t array < <(exec sudo iwlist wlan0 scan | grep 'Address')

shopt -s lastpipe
sudo iwlist wlan0 scan | grep 'Address' | readarray -t array