'Using a variable as a case pattern in Bash
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 "$1" in
$test)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
I've tried this with assigning $test as aaa|bbb|ccc, (aaa|bbb|ccc), [aaa,bbb,ccc] and several other combinations. I also tried these as the pattern in the case statement: @($test), @($(echo $test)), $($test). Also no success.
For clarity, I would like the variable to represent multiple patterns like this:
case "$1" in
aaa|bbb|ccc)
echo "matched"
;;
*)
echo "didn't match"
;;
esac
Solution 1:[1]
Here's something a bit different:
#!/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:
- If either
aaa,bbb, orcccis the first argument to the script, this will outputmatched - pattern1. - If either
helloorworldis the first argument, this will outputmatched - pattern2. - Otherwise it will output
didn't match.
Solution 2:[2]
Using eval also works:
eval 'case "$1" in
'$test')
echo "matched"
;;
*)
echo "did not match"
;;
esac'
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Peter Mortensen |
| Solution 2 | Peter Mortensen |
