239

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

但是在像 Bash 这样的现代脚本环境中,我一直更喜欢使用小写字母命名临时变量,而大写字母仅用于导出(即环境)变量。例如:

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

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

4

8 回答 8

319

按照惯例,环境变量(PAGER, EDITOR, ...)和内部 shell 变量(SHELL, BASH_VERSION, ...)都是大写的。所有其他变量名称应为小写。

请记住,变量名是区分大小写的;此约定避免意外覆盖环境和内部变量。

遵守这个约定,您可以放心,您不需要知道 UNIX 工具或 shell 使用的每个环境变量,以避免覆盖它们。如果它是您的变量,请将其小写。如果你导出它,大写它。

于 2009-03-23T15:53:24.170 回答
45

始终遵循的任何命名约定总是有帮助的。以下是一些有关 shell 变量命名的有用提示:

  • 对导出的变量和常量使用全部大写和下划线,尤其是当它们在多个脚本或进程之间共享时。在适用的情况下使用通用前缀,以便相关变量脱颖而出,并且不会与全大写的Bash 内部变量发生冲突。

    例子:

    • 具有公共前缀的导出变量:JOB_HOME JOB_LOG JOB_TEMP JOB_RUN_CONTROL
    • 常数:LOG_DEBUG LOG_INFO LOG_ERROR STATUS_OK STATUS_ERROR STATUS_WARNING
  • 对范围为单个脚本或块的所有变量使用“蛇形大小写”(所有小写和下划线)。

    例子:input_file first_value max_amount num_errors

    当局部变量与环境变量有某种关系时,请使用混合大小写,例如:old_IFS old_HOME

  • 对“私有”变量和函数使用前导下划线。如果您曾经编写过一个 shell 库,其中库文件内或跨文件的函数需要共享变量,而不会与主代码中可能类似命名的任何内容发生冲突,则这一点尤其重要。

    例子:_debug _debug_level _current_log_file

  • 避免骆驼案。这将最大限度地减少由大小写错误引起的错误。请记住,shell 变量区分大小写

    示例:inputArray thisLooksBAD, numRecordsProcessed,veryInconsistent_style


也可以看看:

于 2017-02-17T05:48:42.350 回答
19

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

POSIX.1-2017 的 Shell and Utilities 卷中的实用程序使用的环境变量名称仅由 Portable Character Set 中定义的字符中的大写字母、数字和下划线 ( _) 组成,并且不以数字开头。

...

包含小写字母的环境变量名称的命名空间是为应用程序保留的。应用程序可以使用此名称空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。

于 2018-09-24T17:23:46.070 回答
7

我做你做的。我怀疑是否有权威来源,但它似乎是一个相当广泛的事实上的标准。

于 2009-03-23T11:36:39.340 回答
5

实际上,“环境变量”一词似乎是最近才出现的。Kernighan 和 Pike 在他们 1984 年出版的经典著作《UNIX 编程环境》中只提到了“shell 变量”——索引中甚至没有“环境”条目!

于 2009-03-23T12:03:45.237 回答
3

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

于 2009-03-23T11:36:21.230 回答
2

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

于 2009-03-23T11:59:34.870 回答
0

Bash 和大多数 shell 脚本解释器可以识别函数中的全局变量和局部变量(例如排版、声明、本地),并且应该酌情使用。如前所述,“POSIX.1-2017 的 Shell and Utilities 卷中的实用程序使用的环境变量名称仅由 Portable Character Set 中定义的字符中的大写字母、数字和下划线 (_) 组成,并且不以带有数字。...包含小写字母的环境变量名称的名称空间是为应用程序保留的。应用程序可以定义任何具有此名称空间名称的环境变量,而无需修改标准实用程序的行为。” (POSIX IEEE Std 1003.1-2008 第 8.1 节

于 2021-05-16T16:03:58.200 回答