2012-07-27 111 views
29

我正在編寫一個shell腳本,我必須檢查是否設置了環境變量,如果沒有設置,那麼我必須設置它。有沒有辦法檢查shell腳本,是否已經設置了環境變量?檢查環境變量是否已經設置

+0

實際上,這不是這個問題的真正重複:這裏的OP想知道是否設置了一個變量,並且如果不是這樣做,而不是退出腳本。 $ {V:?}在這種情況下不是有效的答案。 'set | grep -q'^ V =''是。這測試了變量的存在並且即使設置了變量但對空字符串也起作用。 – Coroos 2015-11-14 20:24:53

回答

27
[ -z "$VARIABLE" ] && VARIABLE="abc" 

if env | grep -q ^VARIABLE= 
then 
    echo env variable is already exported 
else 
    echo env variable was not exported, but now it is 
    export VARIABLE 
fi 

我想強調的是[ -z $VARIABLE ]是不夠的,因爲你可以有VARIABLE但它不是出口。這意味着它根本不是一個環境變量。

+0

這個工作在所有的shell環境中嗎? – Mojoy 2012-07-27 11:00:39

+0

@ Senthilnathan:是的,當然,唯一可以重寫的代碼就是'grep -q'。人們可以編寫'env |而不是使用grep^VARIABLE =>/dev/null。 – 2012-07-27 11:02:20

+0

如果我導出一個變量,然後將該變量設置爲別的東西而不導出它,最終我的非導出變量和我的導出變量之間是否不匹配,還是會自動更新導出的變量? – ArtOfWarfare 2015-09-11 11:29:00

7
if [ -z "$VARIABLE" ]; then 
    VARIABLE=... 
fi 

這會檢查$ VARIABLE的長度是否爲零。

13

你想要做的是在bash本地,它被稱爲參數替換:

VARIABLE="${VARIABLE:=abc}" 

如果沒有設置變量,右邊將等於ABC。請注意,內部操作符:=可能替換爲: - 測試VARIABLE是否未設置或爲空。

+0

正是我在找的東西。如果TEST_DATABASE_NAME尚未定義,那麼'export TEST_DATABASE_NAME =「$ {TEST_DATABASE_NAME:= prodlike}」行只會將prodlike用作默認值。沒有凌亂的條件塊。全部在一行代碼中。 – 2017-04-15 05:41:46

46

的標準溶液,以有條件地分配可變(無論是在環境或不)是:

: ${VAR=foo} 

,將設置VAR爲值「foo」的僅當它是未設置。
要設置VAR爲「富」如果VAR沒有設置或者爲空字符串,使用:

: ${VAR:=foo} 

爲了把VAR的環境中,跟進:

export VAR 

你也可以做export VAR=${VAR-foo}export VAR=${VAR:=foo},但一些較舊的shell不支持在同一行中分配和導出的語法。另外,DRY;使用=運營商兩側的名稱是不必要的重複。 (導出變量的第二行違反了同一個主體,但感覺更好。)

請注意,確定變量是否在環境中通常非常困難。解析env的輸出將不起作用。試想一下:

export foo=' 
VAR=var-value' 
env | grep VAR 

它也沒有工作產卵子shell和測試:

sh -c 'echo $VAR' 

將表明VAR被設置在子shell,這將是一個指標,VAR是環境當前進程,但可能只是在子shell的初始化中設置了VAR。然而,在功能上,結果與VAR在環境中相同。幸運的是,您通常不關心VAR是否在環境中。如果你需要它,把它放在那裏。如果你需要它,拿出來。

+0

您可以添加一個關於':$ {VAR:= foo}'符號如何在內部工作的解釋嗎?我總是覺得它是解決方案,但從來沒有如何實際工作。 – 2014-01-13 18:03:59

+1

我在[StackOverflow](http://stackoverflow.com/questions/4437573/bash-assign-default-value)上找到了一些解釋! – 2014-01-13 18:09:33