String bash:在多个其他字符串中查找字符串

String bash:在多个其他字符串中查找字符串,string,bash,list,search,String,Bash,List,Search,我试图使用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 我尝试使用,但它只适用于单个字符串集 最初,我使用数组将选项存储在一个集合中,但是,字符

我试图使用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

我尝试使用,但它只适用于单个字符串集

最初,我使用数组将选项存储在一个集合中,但是,字符串搜索似乎更有效

非常感谢

  • IMO,最简单的方法就是硬编码一堆
    案例…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
    
    查看它

  • < >考虑关联数组,请参阅<强> < /强>:

    #!/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
    

    只缩短了一点@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
    

    集合是否“给定”(不变)?是的,它们是给定的(它们不会改变)。+1表示两个解决方案,不过最好提到第二个解决方案是
    bash
    version4或更高版本。+1表示使用变量间接寻址,但在bash中完成任务:
    如果[${!group}==*${MY_CHOICE}*]
    
    #!/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