I\'m trying to write a Bash script that uses a variable as a pattern in a case statement. However I just cannot get it to work.
Case statement:
case
(Updated): here's something a bit different, but I hope it works for what you need it for:
#!/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
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:
aaa
, bbb
, or ccc
is the first argument to the script, this will output matched - pattern1
. hello
or world
is the first argument, this will output matched - pattern2
. didn't match
.You can use the extglob
option:
#! /bin/bash
shopt -s extglob # enables pattern lists like +(...|...)
test='+(aaa|bbb|ccc)'
for x in aaa bbb ccc ffffd ; do
echo -n "$x "
case "$x" in
$test) echo Matches.
;;
*) echo Does not match.
esac
done
using eval also works:
eval 'case "$1" in
'$test')
echo "matched"
;;
*)
echo "did not match"
;;
esac'