我可以将多个数据条目分配给一个变量吗?如果可以,如何分配?

我可以将多个数据条目分配给一个变量吗?如果可以,如何分配?

我正在使用 Linux Bash/Shell,我想知道如何将多个单独的数据条目分配给一个变量。

例如团队列表。每支球队需要的数据有:主场总进球数 - 客场总进球数 - 主场总失球数 - 客场总失球数等。

答案1

shellbash可以将单个字符串存储在单个普通变量中,将字符串列表存储在数组中,以及将与其他字符串关联的字符串存储在关联数组中。您将无法存储例如数组的数组或关联数组的关联数组(或其组合)。

对于您提到的特定数据,您可以做一些类似关联数组的事情:

declare -A goals

goals["teamA"]="0:2:3:4"
goals["teamB"]="1:3:3:3"
# etc.

或者

declare -A goals

goals=(
    ["teamA"]="0:2:3:4"
    ["teamB"]="1:3:3:3"
    # etc.
)

然后:在需要时解析出 - 分隔的值:

for team in "${!goals[@]}"; do
    home_goals=$( cut -d : -f1 <<<"${goals[$team]}" )
    away_goals=$( cut -d : -f2 <<<"${goals[$team]}" )
    # etc.

    # use "$team", "$home_goals", "$away_goals" etc. here
done

...但它会是很多使用 Perl 或 Python 等语言可以更有效地执行此操作允许任意嵌套的数据结构。

例如,在 Perl 中:

my %goals = ( "teamA" => [ 0, 2, 3, 4 ],
              "teamB" => [ 1, 3, 3, 3 ],
              # etc.
            );

答案2

我所知道的 shell 并不能很好地处理这样的结构数据,因为它们没有任何嵌套的数据结构。 (其中包括您标记的 Bash。)您需要一个对象列表或 C 风格结构,但您所能拥有的只是数组和关联数组。

一种方法是为您拥有的每条数据(进球数、失球数……)创建单独的关联数组,并按球队名称作为数组的关键字。

所以,例如

declare -A goals_scored goals_conceded
goals_scored[Liverpool]=4
goals_conceded[Liverpool]=2
goals_scored[Tottenham]=3
goals_conceded[Tottenham]=3
for team in "${!goals_scored[@]}"; do       # iterate over the keys of goals_scored
    echo "$team has scored ${goals_scored[$team]} goals"
done

这有点难看,因为数据项位于顶层,并且如果您还有例如玩家的结构,它们就会开始混淆。 (例如,goals_scored可以适用于团队或玩家,因此您必须以某种方式将它们分开。)

使用适当的编程语言可能是一个更好的主意。

数组/关联数组Bash指南有关关联数组的更多信息。

答案3

您可以ksh93使用复合变量来做到这一点:

ksh93$ typeset -A teams
ksh93$ teams[A]=(scored=(home=3 away=7) conceded=(home=1 away=0))
ksh93$ teams[B]=(scored=(home=2 away=0) conceded=(home=3 away=1))

ksh93$ echo ${teams[A].conceded}
( away=0 home=1 )
ksh93$ echo ${teams[A].conceded.away}
0
ksh93$ teams[A].conceded.away=1

不幸的是,它们不会像哈希那样从头开始自动激活perl

ksh93$ foo.bar.baz=quux
ksh93: foo.bar.baz=quux: no parent

ksh93$ foo=()  # or typeset -C foo
ksh93$ foo.bar.baz=quux

ksh93$ typeset -p foo
typeset -C foo=(bar=(baz=quux))

相关内容