文章目錄
- 1.什麼是環境變量?
-
- 1.1 全局環境變量
- 1.2 局部環境變量
- 2.設定使用者定義變量
-
- 2.1 設定局部使用者變量
- 2.2 設定全局使用者變量
- 3.删除環境變量
- 4.預設的shell環境變量
- 5.設定PATH環境變量
- 6.定位系統環境變量
-
- 6.1 登入時作為預設登入shell
- 6.2 作為非登入shell的互動式shell
- 6.3 作為運作腳本的非互動shell
- 6.4 環境變量持久化
- 7.數組變量
note:很多程式和腳本都通過環境變量來擷取系統資訊、存儲臨時資料和配置資訊。
1.什麼是環境變量?
bash shell用一個叫作環境變量(environment variable)的特性來存儲有關shell會話和工作環境的資訊(這也是它們被稱作環境變量的原因)。
這項特性允許你在記憶體中存儲資料,以便程式或shell中運作的腳本能夠輕松通路到它們。
這也是存儲持久資料的一種簡便方法。
環境變量分為如下兩類:
- 全局環境變量
- 局部環境變量
1.1 全局環境變量
全局環境變量對于shell會話和所有生成的子shell都是可見的。
如何檢視全局環境變量?
使用env或者printenv指令,甚至是echo,注意使用echo時候,必須在環境變量名前面加上一個美元符号
$
。
這是因為在echo指令中,在變量名前加上$可不僅僅是要顯示變量目前的值。它能夠讓變量作為指令行參數。
note:
要顯示個别環境變量的值,可以使用printenv指令,但是不要用env指令。
eg:
echo $HISTSIZE
printenv HOME
1.2 局部環境變量
局部變量則隻對建立它們的shell可見。
在Linux系統并沒有一個隻顯示局部環境變量的指令。set指令會顯示為某個特定程序設定的所有環境變量,包括局部變量、全局變量以及使用者定義變量。
note:
系統環境變量基本上都是使用全大寫字母,以差別于普通使用者的環境變量。
notice:
- 指令env、printenv和set之間的差異很細微。
- set指令會顯示出全局變量、局部變量以及使用者定義變量。它還會按照字母順序對結果進行排序。
- env和printenv指令同set指令的差別在于前兩個指令不會對變量排序,也不會輸出局部變量和使用者定義變量。在這種情況下,env和printenv的輸出是重複的。
- 不過env指令有一個printenv沒有的功能,這使得它要更有用一些。
2.設定使用者定義變量
2.1 設定局部使用者變量
1.可以通過等号給環境變量指派,值可以是數值或字元串。
eg:
my_variable=Hello
ps:如果要給變量賦一個含有空格的字元串值,必須用單引号來界定字元串的首和尾。
eg:
my_variable="Hello World"
note:
所有的環境變量名均使用大寫字母,這是bash shell的标準慣例。如果是你自己建立的局 部變量或是shell腳本,請使用小寫字母。變量名區分大小寫。在涉及使用者定義的局部變量 時堅持使用小寫字母,這能夠避免重新定義系統環境變量可能帶來的災難。
notice:
- 變量名、等号和值之間沒有空格,這一點非常重要。否則視為單獨指令。
- 局部環境變量在子shell中不可見,即不可用。
- 子shell中建立的局部環境變量退出該子shell後失效。父shell中建立的局部環境變量在進入子shell後退出子shell傳回父shell,原先建立的局部環境變量仍可用。
2.2 設定全局使用者變量
在設定全局環境變量的程序所建立的子程序中,該變量都是可見的。
建立全局環境變量的方法是先建立一個局部環境變量,然後再把它導出到全局環境中。
該過程使用export指令來完成,變量名前不需要加
$
。
eg:
my_variable="I am Global now"
export my_variable
echo $my_variable
I am Global now
notice:
- 修改子shell中全局環境變量并不會影響到父shell中該變量的值。反之,修改父shell中的全局變量則會影響到子shell中該變量的值,子shell甚至無法使用export指令改變父shell中全局環境變量的值。
3.删除環境變量
删除環境變量則使用unset指令來實作。
記住引用環境變量的時候不要使用$
eg:
unset my_variable
notice:
- 如果要用到變量,使用
;如果要操作變量,不使用$。這條規則的一個例外就是使用printenv顯示某個變量的值。$
- 和修改變量一樣,在子shell中删除全局變量後,無法将效果反映到父shell中。
4.預設的shell環境變量
預設情況下,bash shell會用一些特定的環境變量來定義系統環境。
具體有哪些環境變量,可參照該書的第6.4章節或自行查詢資料。
5.設定PATH環境變量
何為PATH環境變量?
當你在shell指令行界面中輸入一個外部指令時,shell必須搜尋系統來找到對應的程式。
PATH環境變量定義了用于進行指令和程式查找的目錄。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnL4kjN0ATNxUTM4IjMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如果指令或者程式的位置沒有包括在PATH變量中,那麼如果不使用絕對路徑的話,shell是沒法找到的。
Q:如何解決應用程式放置可執行檔案的目錄常常不在PATH環境變量所包含的目錄中的問題?
A:保證PATH環境變量包含了所有存放應用程式的目錄,可以把新的搜尋目錄添加到現有的PATH環境變量中,無需從頭定義。PATH中各個目錄之間是用冒号分隔的。你隻需引用原來的PATH值,然後再給這個字元串添加新目錄就行了。
eg:
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:
/sbin:/bin:/usr/games:/usr/local/games
$
$ PATH=$PATH:/home/christine/Scripts
$
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/
games:/usr/local/games:/home/christine/Scripts
這樣就可以使用/home/christine/Scripts下面的指令了。
notice:
- 對PATH變量的修改隻能持續到退出或重新開機系統。這種效果并不能一直持續。
6.定位系統環境變量
當Linux系統啟動一個bash shell的時候,預設情況下bash會在幾個檔案中查找指令,稱之為啟動檔案或環境檔案。
bash檢查的啟動檔案取決于你啟動bash shell的方式。
啟動bash shell有如下3種方式:
- 登入時作為預設登入shell
- 作為非登入shell的互動式shell
- 作為運作腳本的非互動shell
6.1 登入時作為預設登入shell
當登入Linux系統時,bash shell會作為登入shell啟動。
登入shell會從如下5個不同的啟動檔案裡讀取指令:
啟動檔案 | 描述 | 分類 |
---|---|---|
/etc/profile | /etc/profile檔案是bash shell預設的的主啟動檔案 隻要你登入了Linux系統,bash就會執行/etc/profile啟動檔案中的指令。 | 預設的bash shell 主啟動檔案 |
$HOME/.bash_profile | 提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變量 | $HOME目錄下的 啟動檔案 |
$HOME/.bashrc | 提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變量 | $HOME目錄下的 啟動檔案 |
$HOME/.bash_login | 提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變量 | $HOME目錄下的 啟動檔案 |
$HOME/.profile | 提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變量 | $HOME目錄下的 啟動檔案 |
ps:
$HOME表示的是某個使用者的主目錄。它和波浪号(~)的作用一樣。
/etc/profile檔案是系統上預設的bash shell的主啟動檔案。系統上的每個使用者登入時都會執行這個啟動檔案。
6.2 作為非登入shell的互動式shell
當bash shell不是登入系統時啟動的(比如是在指令行提示符下敲入bash時啟動),則是互動式shell。互動式shell不會像登入shell一樣運作,但它依然提供了指令行提示符來輸入指令。
notice:
- .bashrc檔案有兩個作用:一是檢視/etc目錄下通用的bashrc檔案,二是為使用者提供一個定制自己的指令别名和私有腳本函數(将在第17章中講到)的地方。
- 如果bash是作為互動式shell啟動的,它就不會通路/etc/profile檔案,隻會檢查使用者HOME目錄中的.bashrc檔案。
6.3 作為運作腳本的非互動shell
系統執行shell腳本時用的就是這種shell。不同的地方在于它沒有指令行提示符。
bash shell提供了BASH_ENV環境變量。
當shell啟動一個非互動式shell程序時,它會檢查這個環境變量來檢視要執行的啟動檔案。
如果有指定的檔案,shell會執行該檔案裡的指令,這通常包括shell腳本變量設定。
如果BASH_ENV變量沒有設定,shell腳本到哪裡去獲得它們的環境變量呢?
有些shell腳本是通過啟動一個子shell來執行的。子shell可以繼承父shell導出過的變量。
例如:如果父shell是登入shell,在/etc/profile、/etc/profile.d/*.sh和$HOME/.bashrc檔案中
設定并導出了變量,用于執行腳本的子shell就能夠繼承這些變量。
notice:
- 腳本能以不同的方式執行。隻有其中的某一些方式能夠啟動子shell。
6.4 環境變量持久化
Q:如何實作環境變量持久化?
A:在/etc/profile.d目錄中建立一個以.sh結尾的檔案。把所有新的或修改過的全局環境變量設定放在這個檔案中。也可以把自己的alias設定放在$HOME/.bashrc啟動檔案中,使其效果永久化
notice:
- 圖形化界面組成部分(如GUI用戶端)的環境變量可能需要在另外一些配置檔案中設定,這和設定bash shell環境變量的地方不一樣。
- 盡量不要将新的或修改過的變量設定放在/etc/profile檔案中。雖然它能夠将環境變量持久化,但一旦更新了所使用的發行版,這個檔案也會更新,那麼之前定制過的變量設定就全丢失了。
7.數組變量
環境變量存在一個特性:可以作為數組使用。
數組是能夠存儲多個值的變量。這些值可以單獨引用,也可以作為整個數組來引用。
要給某個環境變量設定多個值,可以把值放在括号裡,值與值之間用空格分隔。
eg:
mytest=(one two three four five)
echo $mytest 錯誤
echo ${mytest[2]} 正确
要顯示整個數組變量,可用星号作為通配符放在索引值的位置。
echo ${mytest[*]}
notice:
- 用unset指令删除數組中的某個值。
unset mytest[2]
- 環境變量數組的索引值都是從零開始。
申明:文中沒特殊注明,圖皆來自Linux指令行與shell腳本程式設計大全<第三版>。