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
_
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
(更新):少し違うものがありますが、必要な目的で機能することを願っています:
#!/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ステートメント構造で使用する複数のパターンセットを指定することもできます。
例えば:
aaa
、bbb
、またはccc
のいずれかがスクリプトの最初の引数である場合、これはmatched - pattern1
を出力します。hello
またはworld
のいずれかが最初の引数である場合、これはmatched - pattern2
を出力します。didn't match
を出力します。evalの使用も機能します:
eval 'case "$1" in
'$test')
echo "matched"
;;
*)
echo "did not match"
;;
esac'