我遇到过许多变量都是大写的shell脚本,我一直认为这是一个严重的误解。我的理解是,按照惯例(也许是很久以前的需要),环境变量都是大写的。

但是在像Bash这样的现代脚本环境中,我总是喜欢使用小写字母表示临时变量,而只对导出变量(即环境变量)使用大写字母。例如:

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

这一直是我对事物的看法。是否有任何权威来源同意或不同意这种方法,或者这纯粹是一个风格问题?


当前回答

如果要将shell变量导出到环境中,值得考虑的是POSIX (Issue 7, 2018 edition)环境变量定义指定:

Shell和utilities中实用程序使用的环境变量名 卷POSIX.1-2017仅由大写字母,数字和 下划线(_)从可移植字符集中定义的字符 不要以数字开头。

...

包含小写字母的环境变量名称空间为 预留给应用程序。应用程序可以定义任何环境变量 类的行为 标准的公用事业公司。

其他回答

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 )

如果要将shell变量导出到环境中,值得考虑的是POSIX (Issue 7, 2018 edition)环境变量定义指定:

Shell和utilities中实用程序使用的环境变量名 卷POSIX.1-2017仅由大写字母,数字和 下划线(_)从可移植字符集中定义的字符 不要以数字开头。

...

包含小写字母的环境变量名称空间为 预留给应用程序。应用程序可以定义任何环境变量 类的行为 标准的公用事业公司。

我做你做的事。我怀疑是否有一个权威的来源,但这似乎是一个相当普遍的事实标准。

我倾向于对环境变量和全局变量都使用ALL_CAPS。当然,在Bash中没有真正的变量作用域,所以有相当一部分变量被用作全局变量(主要是设置和状态跟踪),而相对较少的“局部变量”(计数器、迭代器、部分构造的字符串和临时变量)。

这只是一个非常广泛的惯例,我怀疑是否有任何“权威”的来源。