2013-03-18 126 views
2

我正在編寫一個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

回答

3

「票友」像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

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不能很好地進行評估,你必須調整腳本。

對於Bourne殼香精(bash中,SH,KSH,zsh中):

export SHELL 
. import_environment 

對於csh口味:(shell變量趨向於在csh殼小寫)

setenv SHELL "$shell" 
source import_environment