我正在使用 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
可以适用于团队或玩家,因此您必须以某种方式将它们分开。)
使用适当的编程语言可能是一个更好的主意。
答案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))