web-dev-qa-db-ja.com

Bashのケースパターンとして変数を使用する

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

ケースステートメント:

_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
_
21
siebz0r

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
22
choroba

更新):少し違うものがありますが、必要な目的で機能することを願っています:

#!/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ステートメント構造で使用する複数のパターンセットを指定することもできます。

例えば:

  • aaabbb、またはcccのいずれかがスクリプトの最初の引数である場合、これはmatched - pattern1を出力します。
  • helloまたはworldのいずれかが最初の引数である場合、これはmatched - pattern2を出力します。
  • それ以外の場合は、didn't matchを出力します。
3
sampson-chen

evalの使用も機能します:

eval 'case "$1" in

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