yae*_*ael 1 linux bash array shell-script
我写了以下脚本
负载函数应该设置数组disk[a]=1和disk[b]=2等
然后函数 out 应该打印数组${disk[a]},和${disk[b]},等等
但是我们从函数中得到的总是数字 4
相反,我想得到以下内容:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
这里有什么问题?
如何修复它以便函数输出将打印:
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
剧本:
#!/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
Run Code Online (Sandbox Code Playgroud)
输出:
./test
run function load
1
2
3
4
run function out
4
4
4
4
Run Code Online (Sandbox Code Playgroud)
看看初始化数组时会发生什么:
$ i=0; for k in a b c d; do A[$k]=$((i++)); done; declare -p A
declare -a A=([0]="3")
Run Code Online (Sandbox Code Playgroud)
只有一个元素存在,它的索引为零。
默认情况下,数组由 numbers索引,并且您使用的索引的数值恰好为零。实际上,在算术上下文中,就像常规数组的下标一样,将字符串作为变量的名称,并使用该变量的值。因此,如果我们将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")
Run Code Online (Sandbox Code Playgroud)
要实际使用字符串本身作为索引,请首先使用declare -A arrayname或将数组声明为关联数组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" )
Run Code Online (Sandbox Code Playgroud)
Bash 数组默认是索引数组:
如果使用以下语法分配了任何变量,则会自动创建索引数组
name[subscript]=value
...但是您使用字母作为索引,因此您可能需要一个关联数组,这意味着您需要一个:
declare -A disk
Run Code Online (Sandbox Code Playgroud)
在调用函数之前。
| 归档时间: |
|
| 查看次数: |
3924 次 |
| 最近记录: |