从一个 shell 脚本导入另一个 shell 脚本中的变量而不执行引用的 shell 脚本

Mat*_*hew 6 linux bash shell command-line shell-script

我有 2 个 shell 脚本,file1.sh 和 file2.sh

文件1.sh

#!/usr/bin/env bash 
export var1="/data/share"
export var2='password'
echo "Hello"
Run Code Online (Sandbox Code Playgroud)

文件2.sh

#!/usr/bin/env bash 
source file1.sh
echo $var1
echo $var2
Run Code Online (Sandbox Code Playgroud)

当我执行 file2.sh 时,我得到以下输出

Hello
/data/share
password
Run Code Online (Sandbox Code Playgroud)

但我的预期输出是

/data/share
password
Run Code Online (Sandbox Code Playgroud)

file1.sh 在 file2.sh 中引用时被执行。如何在 file2.sh 中单独导入变量而不执行 file1.sh?

Arg*_*uts 7

当我有一个 bash 脚本时,我希望在获取该脚本时与执行该脚本时有不同的行为(或者换句话说,我希望在不执行任何代码的情况下访问脚本中的数据项)时,我会使用三个选项时间)。这些评论在一定程度上触及了他们。

选项一

确定何时进行采购并在适当的时间结束“采购”

将脚本分成两部分,在进入较低的第二个部分之前从脚本中退出

创建带有定义(函数/变量分配/等)的脚本的上半部分,但不直接执行代码。

在可执行代码部分开始之前,放置逻辑,如果检测到脚本正在被获取,则该逻辑将退出脚本。以下代码段将执行此操作:


文件1.sh

#!/usr/bin/env bash
export var1="/data/share"
export var2='password'    
# --- End Definitions Section ---    
# check if we are being sourced by another script or shell
[[ "${#BASH_SOURCE[@]}" -gt "1" ]] && { return 0; }
# --- Begin Code Execution Section ---
echo "Hello"
echo $var1
echo $var2 
Run Code Online (Sandbox Code Playgroud)


文件2.sh

#!/usr/bin/env bash 
source file1.sh
echo "$var1"
echo "$var2"
Run Code Online (Sandbox Code Playgroud)


运行 ./file2.sh 的输出

$ ./file2.sh 
/data/share
password
Run Code Online (Sandbox Code Playgroud)

选项二

这个通常只在复杂的情况下使用,对于这个特定的例子来说它是多余的。我在要获取源的文件中创建一个函数,并在该函数中确定调用者应该可以使用的内容。在本例中,它是两个导出的变量。通常,当我有关联数组时,我会使用此模式,否则几乎不可能传递这些数组。另外,tmp 文件应该由调用者删除;但在这种情况下我没有:


文件1.sh

#!/usr/bin/env bash 
export var1="/data/share"
export var2='password'
exportCfg() {
  tmpF=$(mktemp)
  declare -p var1 var2 > "$tmpF"
  echo "$tmpF"
}
if [ "$1" == "export" ]; then
  exportCfg;
  exit 0;
fi

echo "Hello"
echo $var1
echo $var2
Run Code Online (Sandbox Code Playgroud)


文件2.sh

#!/usr/bin/env bash 
source $(./file1.sh export)


echo "$var1"
echo "$var2"
Run Code Online (Sandbox Code Playgroud)

执行file2.sh的输出与上面相同

选项3

我处理此问题的最后一种常见方法是使用仅包含定义的库文件,并且没有在获取或直接运行时执行的代码。这只是划分代码的问题。我有一组 bash“库”,其中包含常用的函数,并且通常在每个项目的基础上设置一个小型可获取的库来存储配置数据(常量)。如果该数据包含填充数组,那么我还将使用选项 2 的版本。