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

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

问题描述:

我正在编写一个shell脚本来设置其值在文件中可用的环境变量。下面是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中工作的环境变量?

+0

对于“任何”的值是什么? – choroba 2013-03-18 09:29:10

+0

bash,tcsh,ksh,... – Mojoy 2013-03-18 09:37:26

“票友”像bash和zsh中证炮弹,您可以设置一个变量,并在同一时间导出为环境变量,像这样:

export FOO=bar 

使用标准POSIX的Bourne shell,相当于实现在两个命令这样做:

FOO=bar 
export FOO 

注意,一旦你导出的变量,可以将其恢复到一个不同的值,以后在脚本中,它仍然出口(你不需要再次导出)。此外,您可以一次导出几个变量:

FOO=bar 
BAZ=quux 
export FOO BAZ 

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

如果您确实希望发生这种情况,可以这样做,但这很棘手。一种方法是使用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不能很好地进行评估,你必须调整脚本。

对于Bourne壳香精(bash中,SH,KSH,zsh中):

export SHELL 
. import_environment 

对于csh口味:(shell变量趋向于在csh壳小写)

setenv SHELL "$shell" 
source import_environment