4

我正在尝试使用 bash 来查找任何字符串“集合”中是否存在短字符串。例如,

FRUIT="apple banana kiwi melon"
VEGETABLE="radish lettuce potato"
COLOR="blue red yellow green brown"

MY_CHOICE="kiwi"
MY_CHOICE_GROUP="?"

MY_CHOICE_GROUP我该如何设置FRUIT

我尝试使用这个 StackOverflow 解决方案,但它只适用于单个字符串集。

最初,我使用数组将选项存储在一个集合中,但考虑到 bash 处理数组迭代的方式,字符串搜索似乎会更有效。

非常感谢!

4

3 回答 3

6
  1. IMO 最简单的方法就是硬编码一堆case...esac标签。

    #!/bin/bash
    function lookup()
    {
        case "$1" in
            apple|banana|kiwi|melon)
                echo "FRUIT"
                ;;
    
            radish|lettuce|potato)  
                echo "VEGETABLE"
                ;;
    
            blue|red|yellow|green|brown)   
                echo "COLOR"
                ;;
        esac
    }
    
    MY_CHOICE="kiwi"
    MY_CHOICE_GROUP=$(lookup "$MY_CHOICE")
    
    echo $MY_CHOICE: $MY_CHOICE_GROUP
    

    在ideone上看直播

  2. 否则,请考虑关联数组,在 ideone 上查看它:

    #!/bin/bash
    declare -A groups
    
    groups["apple"]="FRUIT"
    groups["banana"]="FRUIT"
    groups["kiwi"]="FRUIT"
    groups["melon"]="FRUIT"
    
    groups["radish"]="VEGETABLE"
    groups["lettuce"]="VEGETABLE"
    groups["potato"]="VEGETABLE"
    
    groups["blue"]="COLOR"
    groups["red"]="COLOR"
    groups["yellow"]="COLOR"
    groups["green"]="COLOR"
    groups["brown"]="COLOR"
    
    MY_CHOICE="kiwi"
    MY_CHOICE_GROUP=${groups[$MY_CHOICE]}
    
    echo $MY_CHOICE: $MY_CHOICE_GROUP
    
于 2013-07-17T22:29:41.987 回答
1

只缩短一点@sehe的答案:

#!/bin/bash

declare -A groups
mkaso() { val="$1"; shift; for key in "$@"; do groups["$key"]="$val"; done; }

mkaso FRUIT apple banana kiwi melon
mkaso VEGETABLE radish lettuce potato
mkaso COLOR blue red yellow green brown
#declare -p groups

MY_CHOICE="kiwi"
MY_CHOICE_GROUP=${groups[$MY_CHOICE]}
echo $MY_CHOICE: $MY_CHOICE_GROUP
于 2013-07-18T00:14:38.267 回答
1
#!/bin/bash
FRUIT="apple banana kiwi melon"
VEGETABLE="radish lettuce potato"
COLOR="blue red yellow green brown"

MY_CHOICE="kiwi"

for group in VEGETABLE COLOR FRUIT
do
    if [[ ${!group} == *${MY_CHOICE}* ]]; then
        MY_CHOICE_GROUP=$group
        break
    fi
done

echo $MY_CHOICE_GROUP
于 2013-07-18T00:43:14.163 回答