2013-07-17 2 views
3

Я пытаюсь использовать bash, чтобы найти короткую строку в любом наборе строк. Например,bash: find string в нескольких других строках

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?

Я попытался использовать this StackOverflow solution, но он работает только с одним набором строк.

Первоначально, я использовал массивы для хранения опций в наборе, но given the waybash handles iteration over arrays, кажется, что поиск строк будет более эффективным.

Большое спасибо!

+0

Являются ли комплекты «заданными» (неизменными)? – sehe

+0

Да, они даны (они не изменятся). –

ответ

5
  1. Самый простой способ, ИМО, было бы просто жёстко кучу 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 
    

    Посмотреть live on ideone

  2. В противном случае, рассмотрим ассоциативные массивы, увидеть live on 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 
    
+0

Ура, это прекрасно работает! Спасибо за помощь. –

+0

+1 для двух решений, хотя было бы неплохо упомянуть, что второй вариант - 'bash' версии 4 или новее. –

1

только укорочение ответ НЕМНОГО @ sehe в:

#!/bin/bash 

declare -A groups 
mkaso() { val="$1"; shift; for key in "[email protected]"; 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
#!/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 
+0

+1 для использования переменной косвенности, но закончить задание в bash: 'if [[$ {! Group} == * $ {MY_CHOICE} *]]; ... ' –

+0

@glennjackman - да, это имеет смысл - спасибо – pmoosh