【问题标题】:Is there any mechanism in Shell script alike "include guard" in C++?Shell脚本中是否有类似C++中“包含守卫”的机制?
【发布时间】:2011-11-23 00:46:26
【问题描述】:

让我们看一个例子:在我的 main.sh 中,我想获取 a.sh 和 b.sh。然而,a.sh 可能已经采购了 b.sh。因此它会导致 b.sh 中的代码执行两次。 C++中是否有类似“include guard”的机制?

【问题讨论】:

  • 您可以设置一个变量并将其用作警卫

标签: shell include-guards


【解决方案1】:

我个人经常使用

set +o nounset # same as set -u

在我的大部分脚本中,因此我总是将其关闭并重新打开。

#!/usr/bin/env bash

set +u
if [ -n "$PRINTF_SCRIPT_USAGE_SH" ] ; then
    set -u
    return
else
    set -u
    readonly PRINTF_SCRIPT_USAGE_SH=1
fi

如果你不喜欢名词集,你可以这样做

[[ -n "$PRINTF_SCRIPT_USAGE_SH" ]] && return || readonly PRINTF_SCRIPT_USAGE_SH=1

【讨论】:

    【解决方案2】:

    在 bash 中,提前返回不会影响源文件,它会像当前文件是一个函数一样返回它。我更喜欢这种方法,因为它避免将整个内容包装在 if...fi 中。

    if [ -n "$_for_example" ]; then return; fi
    _for_example=`date`
    

    【讨论】:

      【解决方案3】:

      如果您正在采购脚本,您通常使用它们来定义函数和/或变量。

      这意味着您可以通过测试其定义的(其中一个)函数或变量来测试该脚本是否已被获取过。

      例如(b.sh):

      if [ -z "$B_SH_INCLUDED" ]
      then
          B_SH_INCLUDED=yes
          ...rest of original contents of b.sh
      fi
      

      据我所知,没有其他方法可以做到这一点。特别是,您不能提前退出或返回,因为这会影响 shell 获取文件。您不必使用仅用于文件的名称;您可以使用文件始终定义的名称。

      【讨论】:

      • 即使你为包含保护设置的值是非空的,如果你使用-z "${B_SH_INCLUDED+x}"来代替会更好。
      猜你喜欢
      • 2022-01-22
      • 2019-04-25
      • 2012-01-19
      • 2011-01-24
      • 2013-06-22
      • 2017-07-31
      • 2017-11-21
      • 2021-09-15
      相关资源
      最近更新 更多