#!/usr/bin/bash
ARGENT=("Nous devons économiser de l'argent."
"Je dois économiser de l'argent.")
BIENETRE=("Comment vas-tu?" "Tout va bien ?")
aoarrs=("${ARGENT}" "${BIENETRE}")
select arr in "${aoarrs[@]}"; do
for el in "${arr[@]}"; do
echo "$el"
done
break
done
我希望此脚本将数组名称打印给用户ARGENT
和BIENETRE
,以便用户可以选择其中之一。用户输入后,脚本将打印所选数组的每个元素。我想从数组的数组 ( ) 中选择select
一个数组来循环aoarrs
。我想使用 select 的原因是因为在现实世界中,我的数组数组中可能不止两个数组。我怎样才能做到这一点?
您将把数组名称存储在 中
aoarrs
,并在选择主体内声明所选名称的nameref:跑步可能看起来像
您需要“键”到“值”的映射,其中“值”是字符串列表,“键”
ARGENT
是BIENETRE
……您走在正确的道路上
aoarrs
,因为您可以将该数组用作关联数组:然后使用类似 的方法迭代该数组中的所有键
for key in ${!aoarrs[@]}…
。遗憾的是,无论出于何种原因,bash 都不允许列表作为这些关联数组的元素。
所以,事情很糟糕。例如,您可以使用保留字符连接列表的元素,以便稍后分割它们(这很愚蠢,因为这意味着您不能在字符串中包含所有字符,或者需要开始转义它们),或者您构建自己的函数获取字符串列表,将它们附加到一个大数组中,然后在该容器上实现自己的关联查找函数(这将是愚蠢的;它不仅会很慢,而且还需要您在相对较大的空间中编写相对较多的代码)语言不合适)。看起来会很糟糕。这是一个我在没有测试的情况下写下来的例子,因为它太丑陋了,我需要把它从我的脑海中清除,但不想再进一步处理它:
下一个选项很神奇,涉及使用 . 按名称“间接寻址”变量
eval
。这是一种邪恶、愚蠢的行为,这里有很多帖子暗示“如果你到了那个时候,那么也许可以使用适当的编程语言而不是 bash”。我同意这一点:整个问题实际上可以用四行 python 来完成,前两行将把“ARGENT”和“BIENETRE”及其列表存储到一个
dict
. 或者实际上,在除 bash(或 C,就此而言)之外的任何其他通用语言中,关联数组都没有那么糟糕。生成数组仅包含变量名称:
declare -n ref=$arr
-引用由其值命名的变量。break 2
-打破 2 个封闭循环。在 ksh93(shell bash 尝试模拟)中会更容易,其中关联数组可以将数组(除其他外)作为值。