如何使关联数组的查找不区分大小写?

3

我有以下代码:

declare -A colortable=(
    ["bcbcbc"]="250"
    ["c6c6c6"]="251"
    ["d0d0d0"]="252"
    ["dadada"]="253"
    ["e4e4e4"]="254"
    ["eeeeee"]="255"
)

# get colors from byobu config
if [ -f ~/.config/byobu/color.tmux ]; then
    source ~/.config/byobu/color.tmux
else
    BYOBU_DARK="\#bcbcbc"
fi

# cut the first two characters
BYOBUCOLOR="${BYOBU_DARK:2}";
#echo $BYOBUCOLOR

LOCALCOLOR="${colortable[$BYOBUCOLOR]}";

这个工作很好,除非我在我的color.tmux中定义的值是大写字母而不是小写字母。我该如何使查找不区分大小写呢?


3
另外提一下,当你想要明确确定变量包含的内容时,考虑使用declare -p varnameprintf '%s=%q\n' varname "$varname",而不是使用echo "$varname" - Charles Duffy
2
请查看 https://ideone.com/cEsCCh,输出应为 250,而不是空字符串。如果您提供的代码实际上没有问题,那么无法修复它。 - Charles Duffy
1
(另外一点是,全大写的变量名被Shell和POSIX工具使用,而至少包含一个小写字符的名称保留供应用程序使用,并且保证不会改变Shell的行为;请参阅http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html中的第四段。请注意,在阅读时,设置Shell变量将自动覆盖任何具有相同名称的环境变量,无需显式的“export”)。 - Charles Duffy
非常感谢你的建议。这真是太愚蠢了。我的实际问题是,在color.tmux中,颜色是用数字和大写字母定义的,而在数组中它们是用小写字母定义的。我没有测试过这一点。对于造成的困扰,我表示抱歉。悄悄溜走 - mcnesium
完整的彩色表格信用去这里顺便说一句。 - mcnesium
显示剩余3条评论
1个回答

1
您可以在参数扩展期间使用${varname,,}将变量转换为小写。因此,更改执行查找的行为:

LOCALCOLOR="${colortable[${BYOBUCOLOR,,}]}"

始终使用小写版本的BYOBUCOLOR进行查找。


(顺便提一下,尽可能考虑切换到小写变量名:全大写的名称可能与对于shell和POSIX指定工具有意义的名称冲突--就像for PATH in */打破了运行其他命令的能力一样,但for path in */是安全的。请参见POSIX规范的第四段,网址为http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html,在这一点上保持警惕,记住,设置shell变量会覆盖任何同名的环境变量,即使没有显式调用export)。

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