我正在尝试创建一个设备中包含的分区数组,这是我的尝试,但它似乎不起作用。
#!/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"
任何帮助都非常感谢!
答案 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