15

我有一个脚本,其中包含几个需要设置为环境变量的变量

变量列表不断变化,我无法修改它。知道我会怎么做吗?

示例文件 foo.sh

FOO="FOOFOO"
BAR="BARBAR"
4

3 回答 3

41

变量和环境变量是有区别的。如果您执行. foo.shfoo.sh包含该行FOO=value,则该变量FOO将在当前进程中分配。它不是环境变量。要成为环境变量(因此可用于子 shell),它必须被导出。但是,shell 提供了一个选项,它使所有变量赋值都将变量提升为环境变量,所以如果你只是这样做:

set -a
. foo.sh
set +a

那么 foo.sh 中的所有变量分配都将成为当前进程中的环境变量。请注意,这并非完全正确:在 bash 中,导出变量使其成为当前 shell 中的环境变量,但在其他 shell(例如破折号)中,导出变量不会使其成为当前 shell 中的环境变量。(但是,它确实会导致在子shell 的环境中对其进行设置。)但是,在shell 的上下文中,变量是否是当前进程中的环境变量并不重要。如果它被导出(并因此设置在任何子流程的环境中),则不在环境中的变量在功能上等同于环境变量。

于 2013-02-16T02:09:33.860 回答
10

您在寻找“。” 命令(在 中也拼写为“源” bash):

source foo.sh

由于您还需要将它们导出到环境中,因此您可能需要做一些额外的工作:

while read -r line; do
    export "$line"
done < foo.sh
于 2013-02-15T22:09:29.133 回答
-1

如果您只想导出具有公共前缀的变量,例如:

BAZ_FOO="FOOFOO"
BAZ_BAR="BARBAR"

你可以简单地这样做:

. foo.sh
variable_list=()
variable_list=( $(set -o posix ; set  |\
                  grep "BAZ_"         |\
                  cut -d= -f1) )
for variable in "${variable_list[@]}"
do
  export "$variable"
done
于 2015-11-23T12:05:23.330 回答