更正Bash和shell脚本变量的大小写

t1qtbnec  于 2022-11-16  发布在  Shell
关注(0)|答案(9)|浏览(141)

我遇到过许多变量全部大写的shell脚本,我一直认为这是一个严重的误解。我的理解是,按照惯例(也许是很久以前的需要),环境变量全部大写。
但是在像Bash这样的现代脚本环境中,我总是倾向于对临时变量使用小写名称,而对导出(即环境)变量使用大写名称。

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

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

6ie5vjzr

6ie5vjzr1#

按照惯例,环境变量(PAGEREDITOR,...)和内部shell变量(SHELLBASH_VERSION,...)都是大写的。所有其他变量名称都应该是小写的。
请记住,变量名称区分大小写;该约定避免了意外地覆盖环境和内部变量。
遵循这个约定,您可以放心,您不需要知道UNIX工具或shell使用的每个环境变量,以避免覆盖它们。如果是您的变量,请将其小写。如果要导出它,请将其大写。

j91ykkif

j91ykkif2#

任何遵循一致的命名惯例都会有帮助。下面是一些关于shell变量命名的有用提示:

  • 对于导出的变量和常量,请使用全部大写和下划线,尤其是当它们在多个脚本或进程中共享时。在适用的情况下,请使用公共前缀,以便相关变量突出显示,并且不会与全部大写的Bash internal variables冲突。

示例:

  • 具有通用前缀的导出变量:一个月一个月一个月一个月一个月
  • 常数:LOG_DEBUGLOG_INFOLOG_ERRORSTATUS_OKSTATUS_ERRORSTATUS_WARNING
  • 对于作用域为单个脚本或块的所有变量,请使用“snake case”(全部小写,下划线)。

示例:input_filefirst_valuemax_amountnum_errors
当局部变量与环境变量有某种关系时,请使用混合大小写,例如:一个月十四个月一个月一个月十五个月一个月

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

示例:_debug_debug_level_current_log_file

  • 避免使用camel大小写。这将最大限度地减少大小写输入错误。记住,shell变量区分大小写

例如:inputArraythisLooksBADnumRecordsProcessedveryInconsistent_style
另请参阅:

kyks70gy

kyks70gy3#

如果要将shell变量导出到环境中,则值得考虑POSIX(2018年第7版)Environment Variable Definition指定:
POSIX.1-2017的Shell和Utilities卷中的实用程序所使用的环境变量名称仅由可移植字符集中定义的字符中的大写字母、数字和下划线(_)组成,并且不以数字开始。
...
包含小写字母的环境变量名称的命名空间是为应用程序保留的。应用程序可以使用此命名空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。

vjrehmav

vjrehmav4#

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

hlswsv35

hlswsv355#

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

jei2mxaa

jei2mxaa6#

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

42fyovps

42fyovps7#

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

z9zf31ra

z9zf31ra8#

Bash和大多数shell脚本解释器都可以识别函数中的全局变量和局部变量如前所述,“POSIX.1-2017的Shell和实用程序卷中的实用程序所使用的环境变量名仅由大写字母、数字和下划线(_),并且不以数字开始。...包含小写字母的环境变量名称的命名空间是为应用程序保留的。应用程序可以使用此命名空间中的名称定义任何环境变量,而无需修改标准实用程序的行为。”(POSIX IEEE Std 1003.1-2008 section 8.1

yqkkidmi

yqkkidmi9#

ALL_CAP太丑,无法快速识别!!!!!!!!!!!!!!!!!!!!!
x1c 0d1x参考值:https://uxmovement.com/content/all-caps-hard-for-users-to-read
对于我自己的配置,我使用我想要的任何配置:

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因为颜色和格式的原因,我更喜欢屏幕截图而不是粘贴文本)

相关问题