bash:将用户输入匹配并替换为另一个数组

bash:将用户输入匹配并替换为另一个数组

首先,对标题感到抱歉。我不知道如何用几句话来表达我的野心。然而,从编码/脚本的角度来看,它应该是非常基本的。不过,我不知何故未能实现它:/

我有一个 bash 脚本等待用户输入(通过提示符或命令行参数)。由于只有几个可接受的答案,我根据数组检查它们。现在我们称之为“包”。每个接受的答案都类似于其他事物的简单且人类可读的别名。这将在第二行的数组中声明。

declare -a packs=('low', 'mid', 'high')
declare -a packcontent=('1+1+2', '2+2+3', '3+3+4')

parameters=${packcontent[xxx]}

我失败的地方是用第二个数组解析第一个数组。如何获取用户输入的索引以便将其传递到变量中?

示例:如果用户说“low”,它应该注意到“low”是第一个数组的第一个(第零个)元素。因此,“参数”应分配给第二个数组的第一个(第零个)元素。

parameters=1+1+2

我不确定我是否错过了中间步骤,或者 bash 无法替代它,但我不知道如何实现这一点。

希望我对这个问题的解释没有那么混乱。

亲切的问候!

答案1

这看起来像是 bash 关联数组的工作!

您可以创建以字符串作为索引的数组。您可能将它们称为其他语言中的“哈希”或“映射”。考虑以下:

$ declare -A packs
$ packs=( [low]='1+1+2' [mid]='2+2+3' [high]='3+3+4' )
$ parameters=${packs[low]}
$ echo $parameters
1+1+2

答案2

龙的回答使用最新版本的 时一切都很好bash,但对于 4.0 之前的版本(例如在 macOS 上),您将不得不依赖普通数组。

您可以这样做:

packcontent=('1+1+2' '2+2+3' '3+3+4')
low=0 mid=1 high=2

parameters=${packcontent[mid]}

中的值$parameters将是,2+2+3因为这是 中索引 1 处的值packcontent。不需要以(" ")mid为前缀,因为数组索引是在算术上下文中计算的。$$mid


对于/bin/sh(没有数组),你可能会逃脱

set -- '1+1+2' '2+2+3' '3+3+4'
low=1 mid=2 high=3

eval "parameters=\$$mid"

也就是说,可能的参数列表将保留在 中"$@",并在 之一的帮助下引用正确的参数$low$mid或者$high在分配给 时引用正确的参数parameters。执行赋值操作将获取要评估的eval字符串,并替换为(在本例中)的值。parameters=$nn$mid

相关内容