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

时间:2012-11-06 15:40:37

标签: bash pattern-matching switch-statement

我正在尝试编写一个Bash脚本,该脚本在case语句中使用变量作为模式。但是我无法让它发挥作用。

案例陈述:

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

我已尝试将$test指定为aaa|bbb|ccc(aaa|bbb|ccc)[aaa,bbb,ccc]以及其他几种组合。我还尝试将这些作为案例陈述中的模式:@($test)@($(echo $test))$($test)。也没有成功。

修改

为清楚起见,我希望变量代表多个这样的模式:

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

3 个答案:

答案 0 :(得分:19)

您可以使用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

答案 1 :(得分:3)

更新):这里有点不同,但我希望它能满足您的需求:

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

答案 2 :(得分:1)

使用eval也有效:

eval 'case "$1" in

    '$test')
        echo "matched"
        ;;
    *)
        echo "did not match"
        ;;
esac'