Shell脚本中是否有类似的机制;“包括防护装置”;在C++;?

Shell脚本中是否有类似的机制;“包括防护装置”;在C++;?,shell,include-guards,Shell,Include Guards,让我们看一个例子:在我的main.sh中,我想获取a.sh和b.sh。a、 然而,上海可能已经采购了b.sh。因此,它将导致b.sh中的代码执行两次。是否有类似于C++中的“包含保护”的机制?< p>如果你在编写脚本,通常使用它们来定义函数和/或变量。 这意味着您可以通过测试脚本定义的(其中一个)函数或变量来测试脚本之前是否已获得源代码 例如(在b.sh)中: 据我所知,没有其他方法可以做到这一点。特别是,您不能提前退出或返回,因为这将影响shell对文件的寻源。您不必使用仅用于文件的名称;您可

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

< p>如果你在编写脚本,通常使用它们来定义函数和/或变量。 这意味着您可以通过测试脚本定义的(其中一个)函数或变量来测试脚本之前是否已获得源代码

例如(在
b.sh
)中:


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

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

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

就我个人而言,我通常使用

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

您可以设置一个变量并将其用作保护。尽管设置为include保护的值是非空的,但最好使用
-z“${B_SH_include+x}”
[[ -n "$PRINTF_SCRIPT_USAGE_SH" ]] && return || readonly PRINTF_SCRIPT_USAGE_SH=1