2017-09-04 212 views
1

我想在Bash中创建一个字典程序有以下选择:1.添加一个字 2.更新意味着 3.打印字典 4.搜索词 5.搜索通过关键字坏数组下标错误

同样,我创建了2个关联数组,其中1个用于存储单词 - 意义和其他用于存储单词的关键字。我不能在数组中存储值。每次我尝试这样做,它给了我一个错误 字典[$单词]:坏数组下标

这里是代码的第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" 
;; 

输出: 字典[$单词]:坏数组下标

回答

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阵列需要,以用作关联一个。

1

读取变量时,在变量名前面加上$(或换行$())。

当为变量赋值时,您做的是而不是在变量名前面加上$

在您的例子您3个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[@]}" 
+0

我承认,我没有注意到在读命令'$' !我的错! –

+1

@GeorgeVasiliou - 说实话,我第一次错过了它......不知道为什么我的OP的'echo/read'语句的剪切粘贴导致空变量!?!? ! :-) – markp

+0

我完全没有注意到,并花费了相当多的时间在这个问题上 – Akshay