Using variable as case pattern in Bash
You can use the extglob
option:
#! /bin/bashshopt -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. esacdone
(Updated): here's something a bit different, but I hope it works for what you need it for:
#!/bin/bashpattern1="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
This makes use of grep
to do the pattern matching for you, but still allows you to specify multiple pattern sets to be used in a case-statement structure.
For instance:
- If either
aaa
,bbb
, orccc
is the first argument to the script, this will outputmatched - pattern1
. - If either
hello
orworld
is the first argument, this will outputmatched - pattern2
. - Otherwise it will output
didn't match
.
using eval also works:
eval 'case "$1" in '$test') echo "matched" ;; *) echo "did not match" ;;esac'