从awk填充bash数组声明失败

时间:2014-04-10 10:20:26

标签: arrays bash awk scripting

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

#!/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"

任何帮助都非常感谢!

2 个答案:

答案 0 :(得分:3)

为了继续使用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")'

答案 1 :(得分:1)

你不需要awk;纯bash代码更清晰:

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