关联数组

时间:2017-09-04 17:13:39

标签: arrays linux bash shell dictionary

我正在尝试使用以下选项在Bash中创建字典程序:1。添加一个单词 2.更新意义 3.打印字典 4.搜索一个单词 5.按关键字搜索

同样,我正在创建2个关联数组,1用于存储单词 - 含义和其他用于存储单词 - 关键字。

问题是我无法在数组中存储值。每次我尝试这样做,都会给我一个错误 dict [$ word]:坏数组下标

以下是第1部分的代码

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 个答案:

答案 0 :(得分:1)

在阅读变量时,您在变量名前加$(或包裹在$())。

为变量分配值时,在变量名前加上$

在您的示例中,您的3x echo/read会话正在尝试为您的变量分配值,但您已使用$为变量开头,这意味着您的变量不是按照你的期望得到设定;这反过来可能会产生错误,因为$word未设置/定义(取决于bash的版本)。

您应该能够通过以下代码片段了解我的意思:

unset word
echo
echo -n "Enter a word : "
read $word
echo ".${word}."

你得到的产品是什么? ...<whatever_you_typed_in>.

您的关联数组也可能有问题(取决于bash版本);正如乔治所提到的,你应该安全地播放它并明确声明你的关联数组。

我建议您像这样修改输入脚本(删除$变量上的前导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[@]}"

答案 1 :(得分:0)

在我的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一个数组才能用作关联数组。