0

这是我在 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
4

2 回答 2

3

BASH 常见问题解答条目 #24:“我在管道中的循环中设置变量。为什么它们在循环终止后消失?或者,为什么我不能通过管道读取数据?”

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

使用以下解决方法:

while read line;
    do array+=("$line")
done < <(sudo iwlist wlan0 scan | grep 'Address')
于 2013-08-23T15:51:59.813 回答
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+ readarray,它也更便宜。mapfile无需初始化array()仅在之前在更全局的上下文中声明为不同类型时才需要重新声明。

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

shopt -s lastpipe
sudo iwlist wlan0 scan | grep 'Address' | readarray -t array
于 2013-08-23T16:11:13.903 回答