我正在编写一个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
用于教育目的的设计说明:
bourne shell风味(bash,sh,ksh,zsh):
export SHELL . import_environment
对于csh风格:(shell变量在csh shell中往往是小写的)
setenv SHELL "$shell" source import_environment