关联数组中的错误数组下标

6
我正在尝试用Bash创建一个字典程序,具有以下选项:1.添加单词 2.更新含义 3.打印字典 4.搜索单词 5.按关键字搜索。
为此,我创建了两个关联数组,一个用于存储单词-含义,另一个用于存储单词-关键字。
问题是我无法将值存储在数组中。每次尝试时,它都会给我一个错误 dict [$ word]:坏的数组下标
这是第一部分的代码:
echo
echo -n "Enter a word : "
read $word
echo
echo -n "Enter it's meaning : "
read $meaning
echo
echo -n "Enter some keywords(with space in between) to describe the word : "
read $keyword

dict[$word]=$meaning
keywords[$word]=$keyword
;;

我也尝试插入以下代码以删除换行符,但最终结果相同。
word=`echo $word | grep -s '\n'`
keyword=`echo $keyword | grep -s '\n'`

我也尝试了以下方法:

dict["$word"]="$meaning"
keywords["$word"]="$keyword"
;;

输出: dict[$word]:无效的数组下标

2个回答

4
读取变量时,在变量名前加上$ (或用$()包装)。
在为变量赋值时,不要在变量名前加上$
在您的示例中,您的3个echo/read会话试图为变量赋值,但是您已经在变量前加上$,这意味着您的变量没有按照您的预期设置; 这反过来可能会生成错误,因为$word未定义/设置(取决于bash版本)。
您可以通过以下代码片段看到我的意思:
unset word
echo
echo -n "Enter a word : "
read $word
echo ".${word}."

你会得到什么输出?..? .<你输入的任何内容>.?

你可能还会遇到关联数组的问题(取决于bash版本);正如George所提到的,你应该保险起见并明确声明关联数组。

我建议像这样编辑你的输入脚本(删除read变量前面的$;明确声明你的关联数组):

echo
echo -n "Enter a word : "
read word
echo
echo -n "Enter it's meaning : "
read meaning
echo
echo -n "Enter some keywords(with space in between) to describe the word : "
read keyword

# print some debug messages:
echo "word=.${word}."
echo "meaning=.${meaning}."
echo "keyword=.${keyword}."

# declare arrays as associative
declare -A dict keywords

# assign values to arrays
dict[$word]=$meaning
keywords[$word]=$keyword

# verify array indexes and values
echo "dict index(es)    : ${!dict[@]}"
echo "dict value(s)     : ${dict[@]}"
echo "keywords index(es): ${!keywords[@]}"
echo "keywords value(s) : ${keywords[@]}"

我承认我没有注意到$在读取命令中的用法!我的错! - George Vasiliou
1
@GeorgeVasiliou - 老实说,我第一次也错过了...没想明白为什么我复制粘贴原帖的 echo/read 语句会导致变量为空!?!? :-) - markp-fuso
我完全没有注意到这一点,已经花费了相当长的时间在这个问题上。 - Akshay

3
在我的bash 4.4版本中,这并没有引发任何错误,但它也不能正常工作:
$ w="one";m="two";d["$w"]="$m";declare -p d
declare -a d=([0]="two")

很明显 bash 将 d 数组识别为普通数组而非关联数组。
相反,下面这个可以正常运行:
$ w="one";m="two";declare -A d;d["$w"]="$m";declare -p d
declare -A d=([one]="two" )

根据Bash手册,您需要先declare -A声明一个数组,才能将其用作关联数组。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接