用户输入搜索 bash 数组

用户输入搜索 bash 数组

各位——

我有点卡住了,在这里。我有一个小脚本,将被合并到一个更大的脚本中。这个小片段应该接受用户输入,并将其与存储变量的列表进行比较。如果用户输入与列出的变量之一匹配,则应输出该变量的字符串;或者,如果它不匹配任何元素,那么它应该将用户输入写入一个新变量。

对于上下文,我所做的是将一些变量定义为字符串(在本例中为教科书的引用信息)。举个例子:

books=()

buffa7="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books=+("$buffa7")

giancoli6="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"
books=+("$giancoli6")

我对这段代码的理解是,它将创建一个数组,books并获取变量$buffa7并将$giancoli6它们附加到列表中。我想做的是提示用户在源上输入:如果他们输入buffa7giancoli6,则应将变量$source重新定义为分配给相应变量的文本。如果用户输入与这些不匹配,则应将变量$source定义为用户输入的任何内容。

我似乎遇到的问题是,当用户输入源信息时,如果他们使用buffa7,bash 似乎认为如果实际字符串buffa7不在其列表中,那么它不必执行任何操作,并认为buffa7不在列表中(这是真的,因为$buffa7是)。任何有关如何进行的建议将不胜感激!

答案1

这可以使用名称引用或变量间接来完成,但您应该做的是使用关联数组。当关联数组可以处理整个条目时,不需要为每个条目使用变量。

declare -A books
books[buffa7]="Wilson, Buffa, Lou. Physics. Pearson, 7th edition, 2009. ISBN: 0321601831"
books[giancoli6]="Giancoli, Douglas C. Physics: Principles with Applications. Prentice Hall, 6th edition. ISBN: 0321736990"

然后:

read input
source=${books[$input]}   # set $source to entry from array
if [[ -z $source ]]       # if $source is empty after that
then                      # $input was not in array, so
    source=$input         # set $source to $input.
fi

相关内容