在 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 中有详细介绍。
我认为我无法 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 中有详细介绍。