24

caseステートメントで変数をパターンとして使用する Bash スクリプトを作成しようとしています。しかし、私はそれを機能させることができません。

ケースステートメント:

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

$testas 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
4

3 に答える 3

25

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
于 2012-11-06T16:07:12.817 に答える
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-statement 構造で使用する複数のパターン セットを指定することもできます。

例えば:

  • aaabbb、またはのいずれかcccがスクリプトの最初の引数である場合、これは を出力しますmatched - pattern1
  • またはが最初の引数の場合、これは を出力しhelloます。worldmatched - pattern2
  • それ以外の場合は出力されますdidn't match
于 2012-11-06T15:48:28.130 に答える
2

evalの使用も機能します。

eval 'case "$1" in

    '$test')
        echo "matched"
        ;;
    *)
        echo "did not match"
        ;;
esac'
于 2016-07-01T20:23:07.127 に答える