【问题标题】:Populating Bash array fails填充 Bash 数组失败
【发布时间】:2013-08-23 15:49:00
【问题描述】:

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

【问题讨论】:

    标签: bash loops while-loop


    【解决方案1】:

    BASH 常见问题解答条目 #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')
    

    【讨论】:

    • 虽然我用过 bash 很久了,但我并不知道,因为我总是使用 while read 来直接打印数据,而不必将它存储在任何地方。无论如何,我通过使用这样的 for 循环解决了我的问题: for line in (sudo iwlist wlan0 scan | grep 'Address');do array+=($line);完毕。干杯
    • @JuanCarlos 使用for 循环不是一个好主意,因为$() 中的扩展值将对路径名扩展开放,并且有时会为$line 提供不同的值。它还使 bash 在读取每一行之前首先为整个输出分配一个大缓冲区,与使用while 读取相比,这对于大输出来说不是一件好事。
    【解决方案2】:

    尝试使用进程替换:

    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
    

    【讨论】:

      猜你喜欢
      • 2014-05-23
      • 2023-04-07
      • 2014-09-22
      • 1970-01-01
      • 2012-04-16
      • 2013-04-02
      • 2023-03-25
      • 2016-07-13
      • 1970-01-01
      相关资源
      最近更新 更多