首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Bash中使用变量作为案例模式

在Bash中使用变量作为案例模式
EN

Stack Overflow用户
提问于 2012-11-06 23:40:37
回答 3查看 16K关注 0票数 23

我正在尝试编写一个Bash脚本,它在case语句中使用变量作为模式。然而,我就是不能让它工作。

Case语句:

case "$1" in
    $test)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac

我尝试过将$test赋值为aaa|bbb|ccc(aaa|bbb|ccc)[aaa,bbb,ccc]和其他几种组合。我还在case语句中尝试了这些模式:@($test)@($(echo $test))$($test)。也没有成功。

编辑

为了清楚起见,我希望该变量表示多个模式,如下所示:

case "$1" in
    aaa|bbb|ccc)
        echo "matched"
        ;;
    *)
        echo "didn't match"
        ;;
esac
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-07 00:07:13

您可以使用extglob选项:

#! /bin/bash

shopt -s extglob         # enables pattern lists like +(...|...)
test='+(aaa|bbb|ccc)'

for x in aaa bbb ccc ddd ; do
    echo -n "$x "
    case "$x" in
        $test) echo Matches.
        ;;
        *) echo Does not match.
    esac
done
票数 24
EN

Stack Overflow用户

发布于 2012-11-06 23:48:28

(更新的):这里有一些不同的东西,但我希望它能用在你需要的地方:

#!/bin/bash

pattern1="aaa bbb ccc"
pattern2="hello world"
test=$(echo -e "$pattern1\n$pattern2" | grep -e $1)

case "$test" in
    "$pattern1")
        echo "matched - pattern1"
        ;;
    "$pattern2")
        echo "matched - pattern2"
        ;;
    *)
        echo "didn't match"
        ;;
esac

这将利用grep为您执行模式匹配,但仍然允许您指定要在case语句结构中使用的多个模式集。

例如:

  • 如果aaabbbccc是脚本的第一个参数,则将输出matched - pattern1
  • 如果helloworld是第一个参数,则输出matched - pattern2。否则将输出didn't match.

票数 3
EN

Stack Overflow用户

发布于 2016-07-02 04:23:07

使用eval也可以:

eval 'case "$1" in

    '$test')
        echo "matched"
        ;;
    *)
        echo "did not match"
        ;;
esac'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13254425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档