Allowed characters in Linux environment variable names
The POSIX standards on shells section of IEEE Std 1003.1-2008 / IEEE POSIX P1003.2/ISO 9945.2 Shell and Tools standard doesn't define the lexical convention for variable names, however a cursory look at the source reveals it uses something similar to
[a-zA-Z_]+[a-zA-Z0-9_]*
(Edit: Added missing underscore in 2nd character class.)
A quick note, as some shells don't support the + in regex, a potentially more portable regex may be:
[a-zA-Z_]{1,}[a-zA-Z0-9_]{0,}
From The Open Group:
These strings have the form name=value; names shall not contain the character '='. For values to be portable across systems conforming to IEEE Std 1003.1-2001, the value shall be composed of characters from the portable character set (except NUL and as indicated below).
So names may contain any character except = and NUL, but:
Environment variable names used by the utilities in the Shell and Utilities volume of IEEE Std 1003.1-2001 consist solely of uppercase letters, digits, and the '_' (underscore) from the characters defined in Portable Character Set and do not begin with a digit. Other characters may be permitted by an implementation; applications shall tolerate the presence of such names.
So while the names may be valid, your shell might not support anything besides letters, numbers, and underscores.