【问题标题】:Trouble with AWK'd command output and bash arrayAWK 的命令输出和 bash 数组出现问题
【发布时间】:2017-12-04 21:35:30
【问题描述】:

我正在尝试获取正在运行的 VirtualBox VM(UUID)的列表并将它们放入一个数组中。下面的命令产生下面的输出:

$ VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}' 

f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a
46b285c3-cabd-4fbb-92fe-c7940e0c6a3f
83f4789a-b55b-4a50-a52f-dbd929bdfe12
4d1589ba-9153-489a-947a-df3cf4f81c69

我想把这些 UUID 放入一个数组中(甚至可能是一个关联数组供以后使用,但现在一个简单的数组就足够了)

如果我执行以下操作:

array1="( $(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}') )"

命令

array1_len=${#array1[@]}
echo $array1_len

输出“1”,因为只有 1 个元素。如果我打印出元素:

    echo ${array1[*]}

我得到了所有 UUID 的一行

( f93c17ca-ab1b-4ba2-95e5-a1b0c8d70d2a 46b285c3-cabd-4fbb-92fe-c7940e0c6a3f 83f4789a-b55b-4a50-a52f-dbd929bdfe12 4d1589ba-9153-489a-947a-df3cf4f81c69 )

我做了一些研究(Bash Guide/Arrays 关于如何解决这个问题,并通过命令替换和重定向发现了这个问题,但它产生了一个空数组

while  read -r -d '\0'; do
        array2+=("$REPLY")
    done < <(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}')

我显然遗漏了一些东西。我在这个网站上查看了几个类似的问题,例如:

不幸的是,没有人提供帮助。在弄清楚如何获取输出并将其分配给数组方面,我将不胜感激。

我在 macOS 10.11.6(El Captain)和 BASH 版本 3.2.57 上运行它

【问题讨论】:

  • 删除双引号:array1=( $(VBoxManage list runningvms | awk -F '[{}]' '{print $(NF-1)}') ),(条目将受到分词和路径名扩展的影响,但这似乎不是问题。)
  • 你和你的while也很亲密。如果您将其更改为:while read -r; do,它也可以工作。
  • @John1024 - 双引号做到了。出于好奇,(即使它没有实际意义),如果有空格导致分词,因为引号使整个输出成为单个长字符串,我将如何处理?
  • @PesaThe - 谢谢!我认为我必须根据我阅读/理解的内容来解释一个空字符)。

标签: arrays bash awk


【解决方案1】:

因为您使用的是 Mac:

brew install bash

然后将此 bash 作为您的 shell,将输出通过管道传输到:

readarray -t array1

关于 -t 选项,手册页说:

-t     Remove a trailing delim (default newline) from each line read.

如果 bash4 解决方案是可接受的,那么给出的建议 例如通过 gniourf_gniourf 在reading-output-of-command-into-array-in-bash 还是很好听的。

【讨论】:

  • 这是一个很好的解决方案,但是我不能使用它。我不喜欢编写依赖于特定环境的脚本。很多时候,我共享脚本或者我无法安装端口/brew,从而使我的解决方案无法运行。我尽量让一切都保持原生。
猜你喜欢
  • 2020-01-17
  • 2011-05-02
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 2016-08-07
  • 2016-02-09
  • 2012-09-13
  • 1970-01-01
相关资源
最近更新 更多