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

yae*_*ael 1 linux bash array shell-script

我写了以下脚本

负载函数应该设置数组disk[a]=1disk[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)

ilk*_*chu 6

看看初始化数组时会发生什么:

$ 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)


Jef*_*ler 5

Bash 数组默认是索引数组

如果使用以下语法分配了任何变量,则会自动创建索引数组 name[subscript]=value

...但是您使用字母作为索引,因此您可能需要一个关联数组,这意味着您需要一个:

declare -A disk
Run Code Online (Sandbox Code Playgroud)

在调用函数之前。