我写了下面的脚本
load函数应该设置数组disk[a]=1
等等disk[b]=2
然后函数 out 应该打印数组${disk[a]}
, and ${disk[b]}
,依此类推
但我们从函数 out 得到的始终是数字4
相反,我想得到以下内容:
1
2
3
4
这里出了什么问题?
如何修复它以便函数输出将打印:
1
2
3
4
剧本:
#!/bin/bash
function load
{
counter=1
for input in a b c d
do
disk[$input]=$counter
let counter=$counter+1
echo ${disk[$input]}
done
}
function out
{
counter=1
for input in a b c d
do
echo ${disk[$input]}
let counter=$counter+1
done
}
echo "run function load"
load
echo "run function out"
out
输出:
./test
run function load
1
2
3
4
run function out
4
4
4
4
答案1
看看初始化数组时会发生什么:
$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -a A=([0]="3")
仅存在一个元素,并且索引为零。
默认情况下,数组是有索引的按数字,而你使用的索引的数值恰好全为零。实际上,在算术上下文中,就像常规数组的下标一样,字符串被视为变量的名称,并使用该变量的值。所以,如果我们将a
, b
... 设置为数字,那么我们会得到不同的结果:
$ a=123; b=456; c=789; d=999; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done;
$ declare -p A
declare -a A=([123]="0" [456]="1" [789]="2" [999]="3")
declare -A arrayname
要实际使用字符串本身作为索引,请首先使用or将数组声明为关联数组typeset -A arrayname
:
$ unset A; declare -A A; i=0;
$ for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -A A=([a]="0" [b]="1" [c]="2" [d]="3" )
答案2
Bash 数组是索引数组默认情况下:
如果使用语法分配任何变量,则会自动创建索引数组
name[subscript]=value
...但是您使用字母作为索引,因此您可能需要一个关联数组,这意味着您需要:
declare -A disk
在调用函数之前。