在 bash(或其他)中设置变量环境变量

pal*_*wim 9 bash shell-script environment-variables

我希望我的脚本读取包含要设置的环境变量的键/值对的文件,然后设置它们。

到目前为止,我有这个:

#!/bin/bash

cat $1 | while read kv
do
    key=${kv%=*}
    val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
    export $key="$val"
done
Run Code Online (Sandbox Code Playgroud)

我想读取这样的文件:

XAUTHLOCALHOSTNAME="localhost"
DISPLAY=":0"
XAUTHORITY="/tmp/some-XAuthority"
Run Code Online (Sandbox Code Playgroud)

我只需要在脚本的持续时间内作用域中的这些变量,所以我不需要解决在脚本中为父作用域设置变量的问题。

从我的测试来看,我认为我的问题在于export $key="$val",所以我认为我只需要替换该行。

jw0*_*013 10

export $key=$val应该可以正常工作bash。我怀疑您的问题是管道 ( |)。管道中的所有命令都在子 shell 中执行。在你的榜样,实例bash运行脚本将叉掉2子shell:一个是cat $1,另一个用于while read ...。在运行while循环的子shell中分配和导出变量,然后在子shell退出时立即将它们全部抛出。解决此问题的一种方法是根本不生成子外壳。与其无用地使用 cat,不如尝试重定向:

while read ...; do
   ...
done < "$1"
Run Code Online (Sandbox Code Playgroud)

BashFAQ 24更详细地解释了这一点。

另一种方法是仅获取文件,并导入导出:

. <(sed '/^export/!s/^/export /' "$1")
Run Code Online (Sandbox Code Playgroud)

<( )就是过程替换。

作为额外的注意事项,由于您正在从参数中读取环境变量,您必须确保参数文件$1是可信来源,这样它就不会对您的脚本造成不良影响。