如何从一个脚本获取变量的值并将其导入到另一个脚本中?但问题是我要获取变量值的脚本也有一些我不想运行的命令:
假设这是 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.sh
。 awk
查找以 开头的行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 file
file
告诉 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.sh
ormodule_2.sh
将会输出:
value_1
答案3
用于source
读取另一个 shell 文件中的文件变量。
假设你的变量var1
被初始化为/pathtoFile1/file1.sh
var1='Sridhar'
在另一个脚本中file2.sh
:
source /pathtoFile1/file1.sh
var2=$var1
现在var2
包含var1
值