如何在 bash 中使用字符串数组

如何在 bash 中使用字符串数组

我写了下面的脚本

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

在调用函数之前。

相关内容