2

我正在编写一个 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 的环境变量?

4

2 回答 2

3

像 bash 和 zsh 这样的“更高级”的 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

于 2013-03-18T09:43:29.330 回答
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,则必须调整脚本。

对于 bourne shell 风味(bash、sh、ksh、zsh):

export SHELL
. import_environment

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

setenv SHELL "$shell"
source import_environment
于 2013-03-24T08:30:12.520 回答