在 bash 脚本中导入环境变量

在 bash 脚本中导入环境变量

我在终端中设置一些环境变量,然后运行我的脚本。如何提取脚本中的变量?我需要了解他们的价值观。简单地称呼它们是$MY_VAR1行不通的;它是空的。

答案1

export如果这些变量确实是调用脚本的环境中的环境变量(即,它们已使用 导出),那么它们在您的脚本中可用。它们不存在表明您尚未导出它们,或者您从它们根本不存在的环境中运行脚本,即使它们作为 shell 变量也是如此。

例子:

$ cat script.sh
#!/bin/sh

echo "$hello"
$ sh script.sh

(输出的一个空行,因为hello任何地方都不存在)

$ hello="hi there"
$ sh script.sh

(仍然只有一个空行作为输出,因为hello它只是一个 shell 变量,而不是一个环境变量)

$ export hello
$ sh script.sh
hi there

或者,仅为此脚本而不是在调用环境中设置环境变量:

$ hello="sorry, I'm busy" sh script.sh
sorry, I'm busy
$ env hello="this works too" sh script.sh
this works too

答案2

您需要确保在调用脚本之前导出您想要在脚本中访问的环境变量。 IE:

Unix> export MY_TEMP=/tmp
Unix> some_script.sh

现在 some_script.sh 可以访问 $MY_TEMP —— 当您调用 shell 脚本时,您将获得一个新环境,其中仅包含导出的变量,除非您通过在脚本命令前面添加句点(“.”)来“获取”它一个空格,然后是您的脚本名称:

Unix>  . some_script.sh  # runs in current environment

调试提示:在脚本顶部附近包含命令set以查看脚本可以看到哪些变量。

答案3

另请注意,如果您希望它们仅在“脚本执行期间”存在,您可以将它们的导出放入一个文件中,然后在脚本中获取该文件。

因为当您执行脚本时,它将在新的 shell 中执行,这样这些变量将仅在该子 shell(及其后代)中导出,并且它们不会最终出现在您自己的 shell 中,即,看起来就像您可以在脚本执行结束后自动取消设置它们。

例子:

# config.txt
export SECRET=foobar
# prog.sh
#!/usr/bin/env sh
source ./config.txt
echo $SECRET

现在运行它:

chmod +x prog.sh
./prog.sh

然后确认 SECRET 变量没有泄漏到您自己的 shell 中:

echo $SECRET # <-- must echo a blank line

相关内容