Expanding tilde inside assignments and strings in bash
case is most useful when its order of expansion is considered. if you construct your conditions in such a way that a previous match will narrow the possibilities for the current match, then you can get much nearer much quicker to your target match. what's more, case seems always to make better sense as a function in itself - so that it might call itself recursively when matches are ambiguous. consider the following:

   pathcase()
        case    $1 in  ([!~]*|'') ! :;;       ### ^tilde or else
        (*/*)
            pathcase "${1%%/*}" "${1#*/}"     ### squeeze to relevant ele
        ;;
        (?)
            path=${HOME-~}${2+/$2}            ### let expansions work, to
        ;;
        (?-)
            path=${OLDPWD:+$OLDPWD${2+/$2}}   ### its not always set
        ;;
        (?+)
            path=$PWD${2+/$2}                 ### it should be
        ;;
        (?*[!-+0-9]*|??*[-+]*)                ### negate
            pathchk -p -- "${1#?}" &amp;&amp;         ### requires standards comp
            eval '[ "$1" != '"$1 ] &amp;&amp;         ### which makes this safe
                  path=$1${2+/\$2}"           ### and this
        ;;
        (${BASH_VERSION+$(( path  =
         ${#DIRSTACK[@]}-${1#?+}-1))}|\
         ${BASH_VERSION+${path##-*}}*)        ### matches !bash||bad inde
            unset path
           ${path?bad tilde: "$1${2+/$2}"}    ### break w/ error
        ;;
        (?+*)
            path=${DIRSTACK[${1#?+}]}${2+/$2}
        ;;
        (*) path=${DIRSTACK[path]}${2+/$2}
        esac