2012-03-18 4 views
2

Я пытаюсь прочитать английский словарь в Linux в ассоциативный массив, используя в качестве значения слова как ключи и предопределенную строку. Таким образом, я могу искать слова по ключевым словам, чтобы убедиться, что они существуют. Также мне нужно, чтобы все слова были строчными. Это довольно просто, но синтаксис bash мешает мне. Когда я запускаю код ниже, я получаю ошибку «плохой массив». Любые мысли о том, почему это может быть?Использование переменной в качестве ключа в ассоциативном массиве bash

function createArrayFromEnglishDictionary(){ 
     IFS=$'\n' 
     while read -d $'\n' line; do 
      #Read string into variable and put into lowercase. 
      index=`echo ${line,,}` 
      englishDictionaryArray[$index]="exists" 
      done < /usr/share/dict/words 
      IFS=$' \t\n' 
    } 
+0

'IFS = $ '\ t \ n'' - это то же самое, что' unset IFS'. – jordanm

+0

Что такое синтаксис '$ {VAR ,,}'? Я никогда не видел этого раньше и не могу найти ссылок в другом месте. –

+0

${VAR,,} означает строчный регистр в Bash. – philcolbourn

ответ

2

$index пусто в какой-то момент. У вас также есть довольно totally pointless use of echo, предполагая, что вам нужна строка дословно, а не сжатая пробел. Просто используйте index="${line,,}".

+0

index = "$ {line ,,}" не работает, но я не знаю почему. Я уже пробовал это и ожидал, что он сработает. Должно ли назначение ключевого значения отличаться от того, каково оно сейчас? – Asgeir

+0

Кажется, что я работаю сейчас, я сначала изменил английскийDictionaryArray [$ index] = "exists" на английскийDictionaryArray ["$ {index}"] = "существует", но это не сработало. И, конечно, ошибка была совершенно неинтуитивной, мне приходилось добавлять пробелы по обе стороны от ". Поэтому [" $ {index} "] работает. Человек, которого я иногда ненавижу bash. – Asgeir

+0

Так что не используйте bash для этих вещей. это много других, более подходящих языков сценариев для такого рода перекрестных манипуляций с цепочками. –

1

Чтобы использовать ассоциативные массивы в Баш, вам нужно Баш версии 4, и вам необходимо объявить массив как ассоциативный массив с declare -A englishDictionaryArray

http://www.linuxjournal.com/content/bash-associative-arrays

1

Объединяя свою работу и другие ответы, попробуйте следующее:

Я использую GNU Баш, версия 4.2.37 (1) -release (x86_64-рс-Linux-гну)

#!/bin/bash 
declare -A DICT 
function createDict(){ 
    while read LINE; do 
     INDEX=${LINE,,} 
     DICT[$INDEX]="exists" 
    done < /usr/share/dict/words 
} 

createDict 

echo ${DICT[hello]} 
echo ${DICT[acdfg]} 
echo ${DICT["a's"]} 
1

Я думаю Follo пример крыла поможет ..

$ declare -A colour 
$ colour[elephant]="black" 
$ echo ${colour[elephant]} 
black 

$ index=elephant 
$ echo ${colour["$index"]} 
black 
Смежные вопросы