【问题标题】:Populating bash array declare from awk fails从 awk 填充 bash 数组声明失败
【发布时间】:2014-05-23 23:48:43
【问题描述】:

我正在尝试创建设备中包含的分区数组,这是我的尝试,但它似乎不起作用。

#!/bin/bash
DISK=sda
declare -a PARTS=("$(awk -v disk=$DISK '$4 ~ disk {printf "[" $2 "]=\"" $3 "\" "}' /proc/partitions)")

这些命令本身似乎有效:

$ DISK=sda
$ awk -v disk=$DISK '$4 ~ disk {printf "[" $2 "]=\"" $3 "\" "}' /proc/partitions
[0]="7987200" [1]="7986408" 
$ declare -a PARTS=([0]="7987200" [1]="7986408" )
$ echo ${PARTS[0]}
7987200
$ echo ${PARTS[1]}
7986408

但不合并:

$ DISK=sda
$ declare -a PARTS=($(awk -v disk=$DISK '$4 ~ disk {printf "[" $2 "]=\"" $3 "\" "}' /proc/partitions))
$ echo ${PARTS[0]}
[0]="7987200"
$ echo ${PARTS[1]}
[1]="7986408"

非常感谢任何帮助!

【问题讨论】:

  • 我会尽量避免使用数组。移植、调试和维护困难。你能做类似for part in $(awk...) of awk ... | while read part; do 的事情吗

标签: arrays bash awk scripting


【解决方案1】:

要继续使用declare 命令进行评估,您必须传递一个包含括号的全部内容的字符串,这是 bash (declare -a VAR=([key]=val ...)) 中数组声明的正确语法。例如,您的命令应该是:

$ DISK=sda
$ declare -a PARTS='('$(awk -v disk=$DISK \
    '$4 ~ disk {printf "[" $2 "]=\"" $3 "\" "}' /proc/partitions)')'

您也可以通过简单地转储数组来检查正确的语法是什么。这是在我的机器上运行awk 命令后的结果:

$ declare -p PARTS
declare -a PARTS='([0]="488386584" [1]="25165824" [2]="16777216" \
    [3]="8388608" [4]="438053895")'

【讨论】:

    【解决方案2】:

    你不需要awk ;纯 bash 中的代码更干净:

    DISK=sda
    declare -a parts   # Optional
    while read maj min blks name; do
      [[ $name =~ ^$DISK ]] && parts[$min]=$blks
    done < /proc/partitions
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 2014-12-31
      • 2023-04-07
      相关资源
      最近更新 更多