【问题标题】:shell split awk to array [duplicate]shell将awk拆分为数组[重复]
【发布时间】:2019-11-06 09:36:29
【问题描述】:

您好,我尝试将 awk 拆分为一个数组。我有这个脚本:

#!/bin/bash

vms_disks=( "${vms_disks[@]}" "$(virsh domblklist $vm --details | awk '/disk/{print $4}')" )
for disk in "${vms_disks[@]}"; do
  echo "upload $disk"
done

此脚本应该在数组"${vms_disks[@]}" 中获取虚拟机"$vm" 的驱动器。但是这个脚本只用一个键填充数组"${vms_disks[@]}"。 echo 的输出应该是:

upload disk1.raw
upload disk2.raw
...

(为每个磁盘上传)

但我明白了:

upload disk1.raw disk2.raw ...

(所有磁盘一起上传一次)

如何从"$(virsh domblklist $vm --details | awk '/disk/{print $4}')"获取数组键

怎么做?

【问题讨论】:

  • 为什么不从 vms_disks=( "$(printf 'hello\nworld\n')" ) 或类似的开始,然后尝试在添加所有其他复杂性之前先使其正常工作?

标签: shell awk


【解决方案1】:

请您尝试一下,由于缺少样本,尚未测试。

mapfile -t myarr < <(virsh domblklist $vm --details | awk '/disk/{print $4}')

【讨论】:

    【解决方案2】:

    当你把双引号括起来时:

    "$(virsh domblklist $vm --details | awk '/disk/{print $4}')"
    

    您正在防止发生分词,这意味着您的数组的内容最多为两个元素(单词)。

    如果数组vms_disks 最初为空,则"${vms_disks[@]}" 将展开为空,因此您的数组只有一个元素。

    假设"$(virsh domblklist $vm --details | awk '/disk/{print $4}' 的输出只有元素之间的空格,那么我认为您可以删除引号并允许进行分词:

    vms_disks=( "${vms_disks[@]}" $(virsh domblklist "$vm" --details | awk '/disk/{print $4}') )
    

    不要忘记命令替换中的引号(例如$vm 周围)仍然很重要!

    由于您已经假设virsh domblklist $vm --details 输出仅包含记录之间的换行符,因此执行相同操作的稍微更稳健的方法是使用循环来构建数组:

    vms_disks=()
    while IFS= read -r disk; do
      vms_disks+=( "$disk" )
    done < <(virsh domblklist "$vm" --details | awk '/disk/{print $4}')
    

    使用mapfile/readarray

    virsh domblklist "$vm" --details | awk '/disk/{print $4}' | 
      mapfile -O ${#vms_disks[@]} -t vms_disks
    

    我正在使用 -O ${#vms_disks[@]} 开始写入数组 vms_disks 的末尾,以防它已经存在并包含元素(这与您在问题中的尝试相匹配)。

    【讨论】:

      猜你喜欢
      • 2021-05-04
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2018-10-23
      • 2017-12-05
      相关资源
      最近更新 更多