用于设置环境变量的Shell脚本

时间:2013-03-18 09:22:21

标签: linux shell unix environment-variables

我正在编写一个shell脚本来设置其值在文件中可用的环境变量。下面是我写的shell脚本,

VARIABLE_FILE=env-var.dat
if [ -f ${VARIABLE_FILE} ] ; then
   . ${VARIABLE_FILE}
   if [ ! -z "${TEST_VAR1}" ] ; then
      export TEST_VAR1="${TEST_VAR1}"
   fi
   if [ ! -z "${TEST_VAR2}" ] ; then
      export TEST_VAR2="${TEST_VAR2}"
   fi
fi

以上代码仅适用于bash shell,因为我使用了export命令来设置环境变量,如果我将它与任何其他shell一起使用,它就会失败。是否有任何命令来设置适用于任何shell的环境变量?

2 个答案:

答案 0 :(得分:3)

像bash和zsh这样的“Fancier”shell允许你设置一个变量并同时将它作为环境变量导出:

export FOO=bar

使用标准的POSIX bourne shell,可以通过以下两个命令来实现等效:

FOO=bar
export FOO

请注意,一旦导出变量,您可以稍后在脚本中将其重置为其他值,并且仍然会导出它(您无需再次导出它)。此外,您可以一次导出多个变量:

FOO=bar
BAZ=quux
export FOO BAZ

你在评论中提到了tcsh,但是csh和衍生物与基于bourne的shell完全不同(不推荐使用!)。您很少能同时使shell脚本与sh和csh兼容。对于csh,请查看setenv

答案 1 :(得分:0)

如果你真的希望这种情况发生,可以做到,但这很棘手。一种方法是使用awk输出正确的语法并评估从awk返回的文本。要在主要的sh和csh风格之间共享一个环境变量值文件,文件中的以下命令会将一个变量值文件导入到环境中:(是的,是的,它是一条巨大的线,因为一些shell处理的方式不灵活反叛。如果你不介意也有.awk文件,你可以使用awk -f ...)

eval `awk '{ var = $1; $1="";  val=substr($0,2); if ( ENVIRON["SHELL"] ~ /csh$/) { print "setenv", var, " \"" val "\";" } else { print var "=\"" val "\"" ; print "export", var }}' $HOME/env_value_file`

变量值文件采用以下格式:

FOO value for foo
BAR foo bar
BAZ $BAR plus values $FOO

用于教育目的的设计说明:

  1. 在awk中,没有简单的方法来访问字段2-NF,所以如果有的话 可能是我们的变量值中的空格我们需要修改$ 1来获取 $ 0即将获得我们想要的价值。
  2. 要使其工作,因为SHELL变量始终设置,但不是 环境变量并没有一致的大写,你必须弄湿 一个SHELL环境变量来自shell的值,如下所示。 在使用脚本之前作为环境变量。
  3. 此外,如果您希望在导入后显示新的环境值 您需要获取环境脚本的环境脚本。
  4. 如果shell不能很好地执行eval,则必须调整脚本。
  5. 对于bourne shell flavor(bash,sh,ksh,zsh):

    export SHELL
    . import_environment
    

    对于csh flavor :( shell变量在csh shell中倾向于小写)

    setenv SHELL "$shell"
    source import_environment