我正在編寫一個bash腳本,它需要檢查環境變量是否存在,並將其設置爲運行腳本的父目錄,如果變量isn已經設置好了。如果它已經設置,它應該什麼也不做。這樣做的最好方法是什麼?設置環境變量爲父目錄(如果尚未設置)
-1
A
回答
3
有兩部分。首先,當前工作目錄的父目錄只是$PWD/..
。其次,你可以,如果它尚未與
: ${MYVAR:=$PWD/..}
第一:
是什麼也不做的指令集,但它的參數仍評估值賦給變量。參數展開運算符:=
具有將MYVAR
設置爲給定值(如果尚未設置)的副作用。
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
相關問題
- 1. 如何將R_HOME環境變量設置爲R主目錄?
- 2. 如何爲Jython設置環境變量?
- 3. 如何爲python設置環境變量
- 4. 如何爲PHP設置環境變量?
- 5. AWS ECS未設置環境變量
- 6. TERM環境變量未設置
- 7. ASP.NET核心環境變量未設置
- 8. 未設置.bashrc中的環境變量
- 9. 意外的環境變量未設置
- 10. Worklight.home環境變量未設置
- 11. Centos:TERM環境變量未設置
- 12. unix「clear」TERM環境變量未設置
- 13. 警告:環境變量SUMO_HOME未設置
- 14. eclipse「TERM環境變量未設置」
- 15. ANDROID_HOME環境變量未設置錯誤
- 16. 環境變量未全局設置
- 17. Node.js未設置的環境變量
- 18. docker-compose未設置環境變量
- 19. 設置環境變量
- 20. 設置Maven環境變量
- 21. 設置Java環境變量?
- 22. 設置apache環境變量
- 23. 設置環境變量
- 24. DrJava設置環境變量
- 25. C設置環境變量
- 26. 設置環境變量
- 27. C#設置環境變量
- 28. 設置環境變量(kubernetes)
- 29. 設置環境變量Windows
- 30. htaccess設置環境變量
爲什麼不使用'$ {MYVAR:= $ {PWD%/ *}}'? –
你可能會在這裏。但是,一般來說,刪除最後一個'/'及其後面的所有內容並不一定會刪除最後一個路徑組件。考慮一個具有尾部'/'的路徑,例如'/ home/me /'。你的建議會產生'/ home/me'。 – chepner
':$ {MYVAR:= $(dirname「$ PWD」)}',正如@LjmDullaart指出的那樣,將是另一種選擇;我想避免在可能的情況下運行其他進程。 – chepner