如何从一个脚本获取变量的值并将其导入到另一个脚本中?

如何从一个脚本获取变量的值并将其导入到另一个脚本中?

如何从一个脚本获取变量的值并将其导入到另一个脚本中?但问题是我要获取变量值的脚本也有一些我不想运行的命令:

假设这是 script1.sh:

variable="Hello"
#some command here e.g. yum check-update

在 script2.sh 中:

echo $var

我找到了一种方法,使用 EXPORT 命令并将 ./script1.sh 放入 script2.sh 中,但它运行其他命令。

那么,如何在不运行变量内部命令的情况下获取变量的值呢?我希望这个问题很清楚。提前致谢!

答案1

总而言之,您希望检索 中的值script1.sh而不运行 中的所有命令script1.sh。我假设这script1.sh不在你的控制之下,可能是因为它是供应商提供的,或者是由顽固的同事管理的,或者类似的问题,这使得它script1.sh必须按原样使用。

我将介绍两种方法。第一个有利于从 中获取特定变量script1.sh,一次一个:

var=$(awk -F'"' '/^variable=/ {print $2}' script1.sh )
echo $var

这用于awk读取(不是执行,只是读取)script1.shawk查找以 开头的行variable=,然后写入该行双引号后面出现的内容。的输出awk被捕获到变量 中var

更详细地说:

  • 该声明的形式为var=$(...).这意味着括号中的任何内容都作为 bash 命令运行,并将其标准输出分配给变量var

  • 在括号内,我们有awk命令:awk -F'"' '/^variable=/ {print $2}' script1.sh。让我们分部分考虑。

  • awk将行(记录)分成字段。 -F'"'告诉 awk 使用双引号作为字段分隔符。

  • /^variable=/告诉awk限制操作以 开头的行variable=。因此,所有杂项命令script1.sh都将被忽略。

  • {print $2}告诉awk打印第二个字段。这意味着双引号字符第一次和第二次出现之间的任何内容。

  • 最后一个参数awk告诉它要读取哪个文件:script1.sh

上述方法适合一次处理一个变量,并且允许您根据需要重命名该变量。

如何处理多个变量

如果您想获取 中分配的所有变量script1.sh,请考虑:

source <(grep -E '^\w+=' script1.sh)

这用于grep从中提取script1.sh看起来像变量赋值的所有行。然后这些行在当前 shell 中运行,并分配变量。

如果您使用此方法,请首先检查以确保您需要所有变量,并且没有任何变量会干扰您正在做的事情。如果存在这样的情况,我们可以使用第二个grep命令排除它们。

依次考虑各个部分:

  • source filefile告诉 shell在当前 shell 中执行。

  • <(...)称为过程替代。它允许我们使用命令的输出来代替文件名。

  • 该命令grep -E '^\w+=' script1.sh提取所有看起来像变量赋值的行。如果您在命令行上单独运行此命令,您应该看到类似以下内容:

    variable="Hello"
    var2="Value2"
    

    等等。您应该首先执行此操作并检查输出以确保这些是您想要执行的行。

答案2

您应该使用三个脚本来执行此操作:

cat ./script/init_vars.sh
    variable_1=value_1
    variable_2=value_2
    variable_3=value_3

cat ./script/module_1.sh
    . ./script/init_vars.sh
    printf %s\\n "$variable_1"

cat ./script/module_2.sh
    . ./script/init_vars.sh
    printf %s\\n "$variable_1"

如果你的文件看起来像^那个^那么你就可以更容易地做到这一点 - 无需依赖正则表达式。运行module_1.shormodule_2.sh将会输出:

value_1

答案3

用于source读取另一个 shell 文件中的文件变量。

假设你的变量var1被初始化为/pathtoFile1/file1.sh

var1='Sridhar'

在另一个脚本中file2.sh

source /pathtoFile1/file1.sh
var2=$var1

现在var2包含var1

相关内容