2017-09-04 32 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