首页 > 解决方案 > Bash 中的双向哈希?

问题描述

我从 bash 脚本调用二进制文件 [用于通过 IP 设置外部设备的状态],其参数不是(容易)人类可读(有意义)。例如“video2,cbl,sat”

因此,我使用对用户更友好的参数(例如“amazon”)调用 bash 脚本,并使用关联数组来获取不友好的参数:

declare -A state=( [amazon]="video2,cbl,sat" )
input_arg=${state[amazon]}
/usr/bin/set_state source:"$input_arg"

当我设置时这很好state,但我还需要获取state并将其返回给 [human] 用户,所以我有反向哈希:

declare -A current_state=( [video2,cbl,sat]="amazon" )
output=$(/usr/bin_get_state)
friendly_output=${current_state["$output"]}
echo "$friendly_output"

有没有办法在不维护两个这样的数组的情况下在 bash 中进行双向哈希?

同一个数组可用于存储两个方向的地图。它会起作用,但感觉不太对劲!

标签: bash

解决方案


Bash 没有提供任何方法来反转散列,因此您需要自己逐个键对其进行迭代。

#!/bin/bash
declare -A state
state=([amazon]="video2,cbl,sat"
       [netflix]="video3,cbl,inet")

declare -A current_state
for key in "${!state[@]}" ; do
    current_state["${state[$key]}"]=$key
done

您可能需要验证这些值是否唯一:

for key in "${!state[@]}" ; do
    if [[ ${current_state["${state[$key]}"]} ]] ; then  # Fix your syntax HL, SO! "
        echo Duplicate "$key". >&2
        exit 1
    fi
    ...

推荐阅读