What are the acceptable characters in a bash variable?

Can someone point me to the place in the bash man page that describes the acceptable name for a bash variable?

I looked and came up with a lot of info (see question edits), but not a clear answer.

  • May be relevant. – Sparhawk Mar 7 '18 at 23:07
  • 2
    So... what is the question? – DopeGhoti Mar 7 '18 at 23:10
  • @DopeGhoti edited for clarity – datUser Mar 8 '18 at 15:48
  • 2
    I'm voting to close this question as off-topic because while it's a great write-up for the rules for variable names, there does not appear to be an actual question in this question. – DopeGhoti Mar 8 '18 at 15:59

You can assign values to variables (with var=value). There's a fine distinction between a parameter and a variable:

A parameter is an entity that stores values. It can be a name, a number, or one of the special characters listed below. A variable is a parameter denoted by a name.

and a name is defined as:

name A word consisting solely of letters, numbers, and underscores, and beginning with a letter or underscore. Names are used as shell variable and function names. Also referred to as an identifier.

(That's the definition in Bash's manual, POSIX probably has something similar.)

So, anything that matches the regex [a-zA-Z_][a-zA-Z_0-9]* (assuming ASCII character ranges) is a valid name for a variable. Unicode characters and punctuation don't work.

That's pretty much the set of characters supported in variable names in most programming languages, though some do support Unicode, too. Words beginning with digits are taken as numbers (note that stuff like 0xabcd and 123e3 are often valid numbers), and the dash is usually taken as the minus operator, so a-b is a simple arithmetic operation of two variables, not one variable. And so on.

The parameters that aren't of that format are the numbered positional parameters (script/function arguments, assignable with set) and the special parameters. Note that _ (a single underscore) is one of the latter, and while you can assign to it without an error, it's not much use since it resets immediately.

These are fine:

$ a123=foo __=bar
$ echo $a123 $__
foo bar


$ _=foo echo bar >/dev/null 
$ echo $_

As for the uppercase ones, there's a list of the variables that are special to Bash or other Bourne-ish shells (ignore the readline variables, they're not related here). They all do seem to start with an uppercase letter, except that there's histchars that's all lowercase(!). Luckily, it only matters if history expansion is enabled.

  • You can have spaces either side of the egual sign in var=value in certain cases. Example: (( var = 6 )); echo $var; – fpmurphy Mar 8 '18 at 1:48
  • You can have unicode characters as variable name, try to set your locale – cuonglm Mar 8 '18 at 2:13
  • @cuonglm, Doesn't work in Bash (Debian's 4.4.12(1)-release). LC_ALL=fi_FI.UTF-8 bash -c 'ä=123' gives bash: ä=123: command not found. ksh and zsh seem to accept that, though. – ilkkachu Mar 8 '18 at 8:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.