Using variable as case pattern in Bash Using variable as case pattern in Bash bash bash

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, or ccc is the first argument to the script, this will output matched - pattern1.
  • If either hello or world is the first argument, this will output matched - pattern2.
  • Otherwise it will output didn't match.


using eval also works:

eval 'case "$1" in    '$test')        echo "matched"        ;;    *)        echo "did not match"        ;;esac'