2017-08-04 112 views
-1

我正在編寫一個bash腳本,它需要檢查環境變量是否存在,並將其設置爲運行腳本的父目錄,如果變量isn已經設置好了。如果它已經設置,它應該什麼也不做。這樣做的最好方法是什麼?設置環境變量爲父目錄(如果尚未設置)

回答

3

有兩部分。首先,當前工作目錄的父目錄只是$PWD/..。其次,你可以,如果它尚未與

: ${MYVAR:=$PWD/..} 

第一:是什麼也不做的指令集,但它的參數仍評估值賦給變量。參數展開運算符:=具有將MYVAR設置爲給定值(如果尚未設置)的副作用。

+0

爲什麼不使用'$ {MYVAR:= $ {PWD%/ *}}'? –

+0

你可能會在這裏。但是,一般來說,刪除最後一個'/'及其後面的所有內容並不一定會刪除最後一個路徑組件。考慮一個具有尾部'/'的路徑,例如'/ home/me /'。你的建議會產生'/ home/me'。 – chepner

+0

':$ {MYVAR:= $(dirname「$ PWD」)}',正如@LjmDullaart指出的那樣,將是另一種選擇;我想避免在可能的情況下運行其他進程。 – chepner

0

三件事:

環境變量是全球可用的,在程序和它的子程序。 shell變量僅在當前shell中可用。您詢問是否存在環境變量。你確定這是你想要的嗎?在這種情況下,你可能想要做一個

if set | grep ^variable_name= > /dev/null ; then 
    #set the variable 
fi 

請注意,這只是檢查變量是否存在。如果你在腳本中很早做到這一點,你幾乎可以肯定這個變量確實是一個環境變量。但是,你真的關心它是否是一個特定於你的本地shell或環境變量的變量嗎?

其次是,你是否在乎變量是否存在?或者你只是想讓它包含父目錄的值?在上面的例子中,你需要set | grep還是足以測試[ "$variable" != "" ]? ,如

if [ "$variable" = "" ] ; then 
    # set the value to the parent-dir 
fi 

三,父目錄一般是dirname $PWD$PWD/..也是父目錄。

所以,如果你不在乎它是否是一個環境變量或沒有,如果你只是希望它包含一個實際的目錄,代碼將是這樣的:

if [ "$variable" = "" ] ; then 
    variable=$(dirname "$PWD") 
fi 

(這是也許更可讀Chepner的答案)

+0

清除'set'的輸出並不可靠。另一個變量的值可能包含您在換行符後檢查的字符串。假設你有'foo = $'bar \ nbaz ='';當你的支票真的只是'foo'的值的一部分時,你會看到'baz'是一個名字。 – chepner