Linux真小白入門教程第十集——環境變數
對於Linux來說,很多程式和指令碼都要通過環境變數來獲取系統的資訊、儲存臨時資料和配置資訊。
bash shell有一個叫做環境變數的特性來儲存有關shell會話和工作環境的資訊,它允許你在記憶體中儲存資料,以便shell指令碼能夠訪問到他們,這也是持久儲存資料的簡便方法。
bash shell 中環境變數分兩類:全域性環境變數和區域性環境變數(不同Linux發行版本上,其專有的環境變數有可能會不一致)
全域性環境變數對於shell會話和所有生成的子shell都是可見的,而區域性環境變數則只對建立它的shell可見。這使得全域性環境變數對那些所建立的子shell 想要獲取到父shell資訊的程式來說,非常有用。
Linux系統在開始bash回話時,就設定了一些全域性環境變數(基本上全部使用大寫字母,以區別普通使用者的環境變數)
env或printenv命令可以檢視全域性變數
(登入方式也會影響到所設定的環境變數)
但是如果要顯示個別環境變數的值,只能使用printenv
或者也可以使用echo,這是需要在變數前面加美元符號$
加上$符號,不僅僅是要顯示變數當前的值,他能夠讓變數作為命令列引數。
比如:
區域性環境變數:
只能在定義他們的程序中可見,Linux系統也預設定義了標準的區域性環境變數。
set命令
注意大小寫區分全域性和區域性變數哦~
set、printenv、env命令之間的差異很細微,set會顯示出所有區域性、全域性以及自定義變數,而且是按照字母順序進行排序。而env和printenv命令是不會排序的,也不會輸出區域性和自定義變數。
設定使用者自定義變數
可以在bash shell中直接設定自己的變數,啟動bash shell後(或者執行了一個shell指令碼),就能建立在這個shell 程序內可見的區域性變量了。使用echo命令
可通過等號給環境變數賦值,值可以是數值或是字串。
如果是帶有空格的字串,那麼必須用雙引號來界定字串的頭尾
沒有單引號的話,bash shell會以為下一個詞是另一個要執行的命令
(所有的系統的環境變數名均使用大寫字母,這是bash shell的標準慣例。所以建立使用者變數或者shell指令碼時,請使用小寫字母以區分開來)
記住:子shell本身的環境變數在它自己的子shell中不可見,退回上一層shell後,才可使用。(沒有繼承關係,完全私有)
如果一個程序設定了一個全域性環境變數,那麼其建立的子程序,是對其子程序可見的。建立全域性環境變數的方法是先建立一個區域性環境變數,然後再把它匯出到全域性環境中。
export命令可以完成這項任務 ,明顯在子shell中可以正確顯示my_variable變數。
然而修改子shell 中全域性環境變數並不會影響到父shell中該變數的值。
如上所示,改變僅在子shell中生效。
子shell甚至無法使用export 命令改變父shell中全域性環境變數的值(依然不變)。
使用unset命令可以刪除已存在的環境變數
unset my_variable
(使用$是要用到變數
不帶$是要操作變數),記住區別(printenv是一個例外)。
在處理全域性環境變數時,僅在子shell中刪除,其仍然在父shell中生效。
一些預設的shell環境變數
預設情況下,bash shell會用一些特定的環境變數來定義系統環境,下面是一小部分例子。
記住並不是每個預設的環境變數都對應有值,也可能為空
設定PATH環境變數
當在shell命令列介面輸入一個外部命令時,shell必須搜尋系統來找到對應的程式,PATH環境變數定義了用於進行命令和程式查詢的目錄。
和Windows的PATH基本一致,只是Linux使用:冒號進行分隔,Windows使用;分號進行分隔。
將可執行程式的目錄放入PATH,即可執行或者使用。
通常使用的方法:
PATH = $PATH:.
使用單點符,將當前目錄加入到PATH環境變數,並且這個修改只能持續到shell退出或者系統重啟。
那麼如何持久化環境變數呢~不同的shell啟動方式,對應在系統不同的啟動檔案中,將環境變數加入到對應的啟動檔案(修改)之後,才能完成持久化的修改。(但是更新Linux版本後,所有檔案都會跟著更新,定製的設定就不會再存在。最好是在/etc/profile.d檔案中建立一個以.sh結尾的檔案,把所有的新的或者修改過得全域性環境變數都設定在這個檔案中)
在大多數發行版中,儲存個人使用者永久性bash shell變數的地方是$HOME/.bashrc檔案。這一點適用於所有型別的shell程序。
環境變數還有一個特點就是可以作為陣列使用,可以儲存多個值的變數,可以單獨引用還可以作為一個數組來使用。
要給某個環境變數設定多個值,把值放在括號中,值與值之間用空格分隔。
my_variable = (a,b,tow,God)
要引用一個單獨的陣列元素,就必須用代表它在陣列中位置的數值作為索引值。
echo ${my_variable[2]}
記得索引值從0開始
要顯示整個陣列,則使用*號
echo ${my_variable[*]}
也可對陣列中的值進行修改
my_variable[2] = today
使用unset刪除某個值時,只能對值進行刪除,位置上為空。
unset my_variable
即可刪除整個陣列
(陣列不經常用到,因為一方面比較麻煩,一方面移植性也不好)