在Bash关联数组中使用变量作为键

15

我正在尝试将Linux中的英文词典读入关联数组中,使用单词作为键和预定义字符串作为值。这样我就可以通过关键字查找单词是否存在。另外,我需要将所有的单词转换为小写字母。这很简单,但是bash语法让我感到困扰。当我运行下面的代码时,出现“bad array subscript”错误。有什么想法是为什么呢?

 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'
    }

IFS=$' \t\n' 相当于 unset IFS - jordanm
${VAR,,}的语法是什么?我以前从未见过这种语法,也找不到其他参考资料。 - Zoey Hewll
<code>${VAR,,}</code> 在 Bash 中表示转换为小写。 - philcolbourn
4个回答

6
我认为以下例子会有所帮助...
$ declare -A colour
$ colour[elephant]="black"
$ echo ${colour[elephant]}
black

$ index=elephant
$ echo ${colour["$index"]}
black

5

$index 在某些时候为空。你还有一个非常毫无意义的使用 echo,假设你想要原样输出这一行而不是压缩空白。只需要使用index="${line,,}"


index="${line,,}" 没有起作用,但我不知道为什么。我之前尝试过这个方法,并期望它能够正常工作。键值分配是否应该与现在的不同? - Asgeir
现在好像可以工作了,我一开始将englishDictionaryArray[$index]="exists"更改为englishDictionaryArray["${index}"]="exists",但是那样不起作用。当然,错误信息完全不直观,我必须在“.”两侧添加空格,这样 [ "${index}" ] 才能正常工作。唉,有时候我真的很讨厌bash。 - Asgeir
所以不要使用bash来进行这些操作。有许多其他更适合做这种高级字符串操作的脚本语言。 - jørgensen

3

1

结合您的工作和其他答案,可以尝试以下方法:

我正在使用GNU bash,版本为4.2.37(1)-release(x86_64-pc-linux-gnu)

#!/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"]}

@Daniel Kuta,六年后它似乎仍然对我有效。这并不能帮助你,但也许你可以提供错误消息、输出和bash版本? - philcolbourn
2
请注意,macOS上的/bin/bash是bash版本3.2,不支持关联数组。Mac用户可以从homebrew等地方安装和使用最新的bash。 - fornwall
3
对于那些不知道 ${LINE,,} 会返回 $LINE 的小写版本的人。 - Yzmir Ramirez

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