天天看點

【讀書筆記】Linux指令行與Shell腳本程式設計大全--使用Linux環境變量1.什麼是環境變量?2.設定使用者定義變量3.删除環境變量4.預設的shell環境變量5.設定PATH環境變量6.定位系統環境變量7.數組變量

文章目錄

  • 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. 全局環境變量
  2. 局部環境變量

1.1 全局環境變量

全局環境變量對于shell會話和所有生成的子shell都是可見的。

如何檢視全局環境變量?

使用env或者printenv指令,甚至是echo,注意使用echo時候,必須在環境變量名前面加上一個美元符号

$

這是因為在echo指令中,在變量名前加上$可不僅僅是要顯示變量目前的值。它能夠讓變量作為指令行參數。

note:

要顯示個别環境變量的值,可以使用printenv指令,但是不要用env指令。

eg:

echo $HISTSIZE
printenv HOME
           

1.2 局部環境變量

局部變量則隻對建立它們的shell可見。

在Linux系統并沒有一個隻顯示局部環境變量的指令。set指令會顯示為某個特定程序設定的所有環境變量,包括局部變量、全局變量以及使用者定義變量。

note:

系統環境變量基本上都是使用全大寫字母,以差別于普通使用者的環境變量。

notice:

  1. 指令env、printenv和set之間的差異很細微。
  2. set指令會顯示出全局變量、局部變量以及使用者定義變量。它還會按照字母順序對結果進行排序。
  3. env和printenv指令同set指令的差別在于前兩個指令不會對變量排序,也不會輸出局部變量和使用者定義變量。在這種情況下,env和printenv的輸出是重複的。
  4. 不過env指令有一個printenv沒有的功能,這使得它要更有用一些。

2.設定使用者定義變量

2.1 設定局部使用者變量

1.可以通過等号給環境變量指派,值可以是數值或字元串。

eg:

my_variable=Hello

ps:如果要給變量賦一個含有空格的字元串值,必須用單引号來界定字元串的首和尾。

eg:

my_variable="Hello World"

note:

所有的環境變量名均使用大寫字母,這是bash shell的标準慣例。如果是你自己建立的局 部變量或是shell腳本,請使用小寫字母。變量名區分大小寫。在涉及使用者定義的局部變量 時堅持使用小寫字母,這能夠避免重新定義系統環境變量可能帶來的災難。

notice:

  1. 變量名、等号和值之間沒有空格,這一點非常重要。否則視為單獨指令。
  2. 局部環境變量在子shell中不可見,即不可用。
  3. 子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:

  1. 修改子shell中全局環境變量并不會影響到父shell中該變量的值。反之,修改父shell中的全局變量則會影響到子shell中該變量的值,子shell甚至無法使用export指令改變父shell中全局環境變量的值。

3.删除環境變量

删除環境變量則使用unset指令來實作。

記住引用環境變量的時候不要使用$

eg:

unset my_variable
           

notice:

  1. 如果要用到變量,使用

    $

    ;如果要操作變量,不使用$。這條規則的一個例外就是使用printenv顯示某個變量的值。
  2. 和修改變量一樣,在子shell中删除全局變量後,無法将效果反映到父shell中。

4.預設的shell環境變量

預設情況下,bash shell會用一些特定的環境變量來定義系統環境。

具體有哪些環境變量,可參照該書的第6.4章節或自行查詢資料。

5.設定PATH環境變量

何為PATH環境變量?

當你在shell指令行界面中輸入一個外部指令時,shell必須搜尋系統來找到對應的程式。

PATH環境變量定義了用于進行指令和程式查找的目錄。

【讀書筆記】Linux指令行與Shell腳本程式設計大全--使用Linux環境變量1.什麼是環境變量?2.設定使用者定義變量3.删除環境變量4.預設的shell環境變量5.設定PATH環境變量6.定位系統環境變量7.數組變量

如果指令或者程式的位置沒有包括在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:

  1. 對PATH變量的修改隻能持續到退出或重新開機系統。這種效果并不能一直持續。

6.定位系統環境變量

當Linux系統啟動一個bash shell的時候,預設情況下bash會在幾個檔案中查找指令,稱之為啟動檔案或環境檔案。

bash檢查的啟動檔案取決于你啟動bash shell的方式。

啟動bash shell有如下3種方式:

  1. 登入時作為預設登入shell
  2. 作為非登入shell的互動式shell
  3. 作為運作腳本的非互動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:

  1. .bashrc檔案有兩個作用:一是檢視/etc目錄下通用的bashrc檔案,二是為使用者提供一個定制自己的指令别名和私有腳本函數(将在第17章中講到)的地方。
  2. 如果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:

  1. 腳本能以不同的方式執行。隻有其中的某一些方式能夠啟動子shell。

6.4 環境變量持久化

Q:如何實作環境變量持久化?

A:在/etc/profile.d目錄中建立一個以.sh結尾的檔案。把所有新的或修改過的全局環境變量設定放在這個檔案中。也可以把自己的alias設定放在$HOME/.bashrc啟動檔案中,使其效果永久化

notice:

  1. 圖形化界面組成部分(如GUI用戶端)的環境變量可能需要在另外一些配置檔案中設定,這和設定bash shell環境變量的地方不一樣。
  2. 盡量不要将新的或修改過的變量設定放在/etc/profile檔案中。雖然它能夠将環境變量持久化,但一旦更新了所使用的發行版,這個檔案也會更新,那麼之前定制過的變量設定就全丢失了。

7.數組變量

環境變量存在一個特性:可以作為數組使用。

數組是能夠存儲多個值的變量。這些值可以單獨引用,也可以作為整個數組來引用。

要給某個環境變量設定多個值,可以把值放在括号裡,值與值之間用空格分隔。

eg:

mytest=(one two three four five)
 echo $mytest   錯誤
 echo ${mytest[2]}  正确

 要顯示整個數組變量,可用星号作為通配符放在索引值的位置。
 echo ${mytest[*]}
           

notice:

  1. 用unset指令删除數組中的某個值。

    unset mytest[2]

  2. 環境變量數組的索引值都是從零開始。

申明:文中沒特殊注明,圖皆來自Linux指令行與shell腳本程式設計大全<第三版>。

繼續閱讀