我将名为“disks”的数组设置为以下单词 - sdb sdc sdd
在 bash shell 中:
declare -A disks
Machine=worker01
disks[$Machine]="sdb sdc sdd"
现在我们打印所有单词如下:
echo ${disks[@]}
sdb sdc sdd
现在我们要打印第一项(应该是 sdb )
echo ${disks[0]}
但没有输出
与以下内容相同:
echo ${disks[1]}
echo ${disks[2]}
还带有:
echo ${disks[3]}
echo ${disks[4]}
……
这里出了什么问题?
也不如:
for i in {1..100}
> do
> echo ${disks[$i]}
> done
那么我如何打印数组“disks”的第一个单词 - 当Machine=worker01
echo ${disks[$Machine]}
答案1
您正在分配给disks[worker01]
,但尝试从中读取disks[0]
。索引不同。
正如有人评论的那样,Bash 没有多维数组,而这正是您真正需要的。您可以使用空格分隔的字符串来粗略地模拟这一点,但随后您需要显式地拆分字符串。
#!/bin/bash
declare -A disks
disks["host1"]="sda sdb"
disks["host2"]="sda sdb sdc"
for m in "${!disks[@]}"; do
# split the string to array 'd'
IFS=' ' read -a d <<< "${disks[$m]}"
printf "$m has disk %s\n" "${d[@]}"
done
答案2
为什么你声明Machines
后就不再使用它了?
$ disks=(sdb sdc sdd)
$ echo ${disks[0]}
sdb
$ echo ${disks[1]}
sdc
$ echo ${disks[2]}
sdd
答案3
数据在 中${disks[worker01]}
,而不是 中${disks[0]}
。
我还想知道您是否正在尝试使用数组的数组:一组机器,每台机器都有一个磁盘阵列。
答案4
如果您只想打印特定值,您可以使用:
echo ${disks[$Machine]} | awk '{print $1}'
其中 $1 = 索引 0
输出:
sdb