用于设置环境variables的Shell脚本

我正在编写一个shell脚本来设置其值在文件中可用的环境variables。 下面是我写的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命令来设置环境variables,如果和其他shell一起使用,它将会失败。 是否有任何命令设置在任何shell中工作的环境variables?

“Fancier”shell像bash和zsh允许你设置一个变量并将其作为一个环境变量同时导出,如下所示:

 export FOO=bar 

使用标准的POSIX bourne shell,相当于通过两个命令来完成:

 FOO=bar export FOO 

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

 FOO=bar BAZ=quux export FOO BAZ 

你在你的评论中提到了tcsh,但是csh和衍生物与bourne-based shell是完全不同的(不推荐使用!)。 很少能同时兼容sh和csh。 对于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 shell风味(bash,sh,ksh,zsh):

 export SHELL . import_environment 

对于csh风格:(shell变量在csh shell中往往是小写的)

 setenv SHELL "$shell" source import_environment