【发布时间】:2013-01-31 23:38:52
【问题描述】:
我有一个脚本,其中包含几个需要设置为环境变量的变量
变量列表不断变化,我无法修改它。知道我将如何去做吗?
示例文件 foo.sh
FOO="FOOFOO"
BAR="BARBAR"
【问题讨论】:
我有一个脚本,其中包含几个需要设置为环境变量的变量
变量列表不断变化,我无法修改它。知道我将如何去做吗?
示例文件 foo.sh
FOO="FOOFOO"
BAR="BARBAR"
【问题讨论】:
变量和环境变量是有区别的。如果你执行. foo.sh并且foo.sh包含FOO=value这一行,那么变量FOO将会在当前进程中被赋值。它不是环境变量。要成为环境变量(因此可用于子 shell),它必须被导出。但是,shell 提供了一个选项,它使所有变量赋值都将变量提升为环境变量,所以如果你只是这样做:
set -a
. foo.sh
set +a
那么 foo.sh 中的所有变量赋值都会成为当前进程中的环境变量。请注意,这并非完全正确:在 bash 中,导出变量使其成为当前 shell 中的环境变量,但在其他 shell(例如破折号)中,导出变量不会使其成为当前 shell 中的环境变量。 (但是,它确实会导致在子shell 的环境中对其进行设置。)但是,在shell 的上下文中,变量是否是当前进程中的环境变量并不重要。如果它被导出(并因此设置在任何子流程的环境中),则不在环境中的变量在功能上等同于环境变量。
【讨论】:
您在寻找“.”吗?命令(在bash 中也拼写为“源”):
source foo.sh
由于您还需要将它们导出到环境中,因此您可能需要做一些额外的工作:
while read -r line; do
export "$line"
done < foo.sh
【讨论】:
source bar.sh 才能影响当前环境。
while 循环代替了source foo.sh;你不需要两者。没有错,只是多余。
bash,它保证会终止。 dhall 是最近的一个语言示例,旨在允许在配置文件的上下文中进行有限执行。
如果您只想导出具有公共前缀的变量,例如:
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
【讨论】: