Correct Bash and shell script variable capitalization

Viewed 76580

I run across many shell scripts with variables in all caps, and I've always thought that there is a severe misunderstanding with that. My understanding is that, by convention (and perhaps by necessity long ago), environment variables are in all-caps.

But in modern scripting environments like Bash, I have always preferred the convention of lower-case names for temporary variables, and upper-case ones only for exported (i.e. environment) variables. For example:

#!/usr/bin/env bash
year=`date +%Y`
echo "It is $year."
export JAVA_HOME="$HOME/java"

That has always been my take on things. Are there any authoritative sources which either agree or disagree with this approach, or is it purely a matter of style?

9 Answers

By convention, environment variables (PAGER, EDITOR, ...) and internal shell variables (SHELL, BASH_VERSION, ...) are capitalized. All other variable names should be lower case.

Remember that variable names are case-sensitive; this convention avoids accidentally overriding environmental and internal variables.

Keeping to this convention, you can rest assured that you don't need to know every environment variable used by UNIX tools or shells in order to avoid overwriting them. If it's your variable, lowercase it. If you export it, uppercase it.

If shell variables are going to be exported to the environment, it’s worth considering that the POSIX (Issue 7, 2018 edition) Environment Variable Definition specifies:

Environment variable names used by the utilities in the Shell and Utilities volume of POSIX.1-2017 consist solely of uppercase letters, digits, and the underscore ( _ ) from the characters defined in Portable Character Set and do not begin with a digit.

...

The name space of environment variable names containing lowercase letters is reserved for applications. Applications can define any environment variables with names from this name space without modifying the behavior of the standard utilities.

I do what you do. I doubt there's an authoritative source, but it seems a fairly widespread de-facto standard.

Actually, the term "environment variables" seems to be of fairly recent coinage. Kernighan and Pike in their classic book "The UNIX Programming Environment", published in 1984, speak only of "shell variables" - there is not even an entry for "environment" in the index!

It's just a very widely held convention, I doubt there's any "authoritative" source for it.

i tend use ALL_CAPS both for environment and global variables. of course, in Bash there's no real variable scope, so there's a good portion of variables used as globals (mostly settings and state tracking), and relatively few 'locals' (counters, iterators, partly-constructed strings, and temporaries)

Bash, and most shell script interpreters, recognize global and local variables within functions (e.g typeset, declare, local) and should be used as appropriate. As previously commented, "Environment variable names used by the utilities in the Shell and Utilities volume of POSIX.1-2017 consist solely of uppercase letters, digits, and the underscore ( _ ) from the characters defined in Portable Character Set and do not begin with a digit. ... The name space of environment variable names containing lowercase letters is reserved for applications. Applications can define any environment variables with names from this name space without modifying the behavior of the standard utilities." (POSIX IEEE Std 1003.1-2008 section 8.1 )

ALL_CAP IS TOO UGLY TO FAST RECOGNIZE !!!!!!!!!!!!!!!!!!!!!

enter image description here ref: https://uxmovement.com/content/all-caps-hard-for-users-to-read

for my own config, I use whatever I want:

  export XDG_CONFIG_HOME=$( realpath "$HOME/.config" )                                                                                                                                           
  export XDG_CACHE_HOME=$( realpath "$HOME/d/.cache_wf" )
  export XDG_DATA_HOME=$( realpath "$HOME/.local/share" )

  # 全部大写, 难辨认, 用这个:
  export cfg_X=$XDG_CONFIG_HOME
  export cache_X=$XDG_CACHE_HOME
  export data_X=$XDG_DATA_HOME

  [ -d "$cfg_X" ] || mkdir -m 0750 -p "$cfg_X"
  [ -d "$cache_X" ]  || mkdir -m 0750 -p "$cache_X"
  [ -d "$data_X" ]   || mkdir -m 0750 -p "$data_X"

(And I prefer screenshot to pasted text, because of color and format)

enter image description here

Related