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