【问题标题】:bash: find string in multiple other stringsbash:在多个其他字符串中查找字符串
【发布时间】:2013-07-16 16:22:17
【问题描述】:

我正在尝试使用 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

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

本来,我是用数组来存储一个集合中的选项,但是given the waybash handles iteration over arrays,似乎字符串搜索会更有效率。

非常感谢!

【问题讨论】:

  • 集合是“给定的”(不变的)吗?
  • 是的,它们是给定的(它们不会改变)。

标签: string bash list search


【解决方案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

【讨论】:

  • +1 用于使用变量间接,但在 bash 中完成工作:if [[ ${!group} == *${MY_CHOICE}* ]]; ...
【解决方案2】:

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

【讨论】:

    【解决方案3】:
    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
      

      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
      

    【讨论】:

    • +1 表示两种解决方案,不过最好提到第二个解决方案是 bash 版本 4 或更高版本。
    猜你喜欢
    • 1970-01-01
    • 2013-03-14
    • 1970-01-01
    • 1970-01-01
    • 2018-12-14
    • 1970-01-01
    相关资源
    最近更新 更多