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

Mig*_*que 1 environment-variables variable

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

假设这是 script1.sh:

variable="Hello"
#some command here e.g. yum check-update
Run Code Online (Sandbox Code Playgroud)

在 script2.sh 中:

echo $var
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*024 5

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

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

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

这用于awk读取(不执行,只是读取)script1.shawk查找以 开头的行,variable=然后写下该行双引号后面出现的内容。的输出awk是 capture into variable 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)
Run Code Online (Sandbox Code Playgroud)

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

如果您使用这种方法,请首先检查以确保您需要所有变量,并且没有任何变量会干扰您正在执行的操作。如果有,我们可以用第二个grep命令排除它们。

依次考虑这些部分:

  • source file告诉外壳程序file在当前外壳程序中执行。

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

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

    variable="Hello"
    var2="Value2"
    
    Run Code Online (Sandbox Code Playgroud)

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