在 Bash 中创建变量数组

Creating an array of variables in Bash

我认为我无法 Google 这个答案的原因是因为我不知道要使用的术语。如果这 post 令人沮丧,我们深表歉意。

我要创建的是 multi-part 个变量的数组;这样一组关键字就可以对应一个相应的MQTT主题。背景(与问题无关)——我打算将自然口语转换为自动化触发器;一旦我有了 table,一个函数就可以将口语句子与我尝试创建的 array/table 进行比较,如果关键字匹配,就会发送相应的 MQTT 消息。我想使用这种table/array方法,这样整体解决方案很容易更新。

在一些虚构的语言中,构建这样一个 table 的代码可能如下所示:

declare -a commandarray
{"keywords":"'lounge tv on'","mqtt":"lounge/tv{on}"} >> $commandarray
{"keywords":"'lounge tv off'","mqtt":"lounge/tv{off}"} >> $commandarray
{"keywords":"'bedroom tv on'","mqtt":"bedroom/tv{on}"} >> $commandarray
{"keywords":"'bedroom tv off'","mqtt":"bedroom/tv{off}"} >> $commandarray

我猜结果会是 table,第 headers 列为 "keywords" 和 "mqtt",可能会像这样显示。我不关心它是如何显示的,这只是为了帮助解释我自己。

keywords            mqtt
--------            --------
lounge tv on        lounge/tv{on}       
lounge tv off       lounge/tv{off}       
bedroom tv on       bedroom/tv{on}       
bedroom tv off      bedroom/tv{off} 

非常感谢任何帮助!

最简单的方法是创建一个单独的文件,而不是创建 table。

所以这是commands.txt的内容:

lounge tv on;lounge/tv{on}
lounge television on;lounge/tv{on}
lounge tv off;lounge/tv{off}
lounge television off;lounge/tv{off}

..和处理文件的代码:

commandsfile="/config/Scripts/mqtt/commands.txt"
cat $commandsfile | while read command; do
    keywords=$(echo $command | cut -d ";" -f1)
    mqtt=$(echo $command | cut -d ";" -f2)
done

您要的是 bash 4 功能,称为 关联数组

declare -A commands=(
  ["lounge tv on"]="lounge/tv{on}"
  ["lounge tv off"]="lounge/tv{off}"
  ["bedroom tv on"]="bedroom/tv{on}"
  ["bedroom tv off"]="bedroom/tv{off}"
)

查找类似于以下内容:

input="lounge tv on"
echo "Running command: ${commands[$input]}"

...并且赋值类似于:

commands["new command"]="new/command{parameter}"

关联数组在 BashFAQ #6, and in the bash-hackers' wiki page on arrays 中有详细介绍。