bash程式設計系列 環境變數

2021-05-28 01:29:24 字數 2528 閱讀 2221

在 bash 和幾乎所有其它 shell 中,使用者可以定義環境變數,這些環境變數在以 ascii字串儲存。環境變數的最便利之處在於:它們是 unix 程序模型的標準部分。這意味著:環境變數不僅由 shell指令碼獨用,而且還可以由編譯過的標準程式使用。當在 bash 中「匯出」環境變數時,以後執行的任何程式,不管是不是 shell指令碼,都可以讀取設定。乙個很好的例子是 vipw 命令,它通常允許 root 使用者編輯系統口令檔案。通過將 editor環境變數設定成喜愛的文字編輯器名稱,可以配置 vipw,使其使用該編輯器,而不使用 vi,如果習慣於 xemacs 而確實不喜歡vi,那麼這是很便利的。

在 bash 中定義環境變數的標準方法是:

$ myvar='this is my environment variable!'

以上命令定義了乙個名為 "myvar" 的環境變數,幷包含字串 "this is my environmentvariable!"。以上有幾點注意事項:第一,在等號 "="的兩邊沒有空格,任何空格將導致錯誤(試一下看看)。第二個件要注意的事是:雖然在定義乙個字時可以省略引號,但是當定義的環境變數值多於乙個字時(包含空格或製表鍵),引號是必須的。

第三,雖然通常可以用雙引號來替代單引號,但在上例中,這樣做會導致錯誤。為什麼呢?因為使用單引號禁用了稱為擴充套件的 bash特性,其中,特殊字元和字元系列由值替換。例如,"!" 字元是歷史擴充套件字元,bash通常將其替換為前面輸入的命令。(本系列文章中將不講述歷史擴充套件,因為它在 bash 程式設計中不常用。有關歷史擴充套件的詳細資訊,請參閱 bash幫助頁中的「歷史擴充套件」一節。)儘管這個類似於巨集的功能很便利,但我們現在只想在環境變數後面加上乙個簡單的感嘆號,而不是巨集。

現在,讓我們看一下如何實際使用環境變數。這有乙個例子:

$ echo $myvar

this is my environment variable!

$ echo foo$myvarbar

foo

我們希望回顯 "foothis is my environmentvariable!bar",但卻不是這樣。錯在**?簡單地說,bash變數擴充套件設施陷入了困惑。它無法識別要擴充套件哪乙個變數:$m、$my、$myvar 、$myvarbar 等等。如何更明確清楚地告述 bash引用哪乙個變數?試一下這個:

$ echo foo$bar

foothis is my environment variable!bar

如您所見,當環境變數沒有與周圍文字明顯分開時,可以用花括號將它括起。雖然 $myvar 可以更快輸入,並且在大多數情況下正確工作,但$卻能在幾乎所有情況下正確通過語法分析。除此之外,二者相同,將在本系列的餘下部分看到變數擴充套件的兩種形式。請記住:當環境變數沒有用空白(空格或製表鍵)與周圍文字分開時,請使用更明確的花括號形式。

回想一下,我們還提到過可以「匯出」變數。當匯出環境變數時,它可以自動地由以後執行的任何指令碼或可執行程式環境使用。shell指令碼可以使用 shell 的內建環境變數支援「到達」環境變數,而 c 程式可以使用 getenv() 函式呼叫。這裡有一些 c**示例,輸入並編譯它們 -- 它將幫助我們從 c 的角度理解環境變數:

myvar.c -- 樣本環境變數 c 程式

#include #include int main(void)

將上面的**儲存到檔案 myenv.c 中,然後發出以下命令進行編譯:

$ gcc myenv.c -o myenv

現在,目錄中將有乙個可執行程式,它在執行時將列印 editor 環境變數的值(如果有值的話)。這是在我機器上執行時的情況:

$ ./myenv

the editor environment variable is set to (null)

啊... 因為沒有將 editor 環境變數設定成任何值,所以 c 程式得到乙個空字串。讓我們試著將它設定成特定值:

$ editor=xemacs

$ ./myenv

the editor environment variable is set to (null)

雖然希望 myenv 列印值 "xemacs",但是因為還沒有匯出環境變數,所以它卻沒有很好地工作。這次讓它正確工作:

$ export editor

$ ./myenv

the editor environment variable is set to xemacs

現在,如您親眼所見:不匯出環境變數,另乙個程序(在本例中是示例 c 程式)就看不到環境變數。順便提一句,如果願意,可以在一行定義並匯出環境變數,如下所示:

$ export editor=xemacs

這與兩行版本的效果相同。現在該演示如何使用 unset 來除去環境變數:

$ unset editor

$ ./myenv

the editor environment variable is set to (null)

shell 變數 環境變數 bash

1.在bash中,shell變數可以直接通過通過如下形式建立 name value 2.shell變數不能被子程序 字shell 繼承,通過export,可以令shell變數成為環境變數 此時會出現在env的輸出中 環境變數可以被子程序繼承 3.shell中檢視當前所有環境變數用命令 env或者pr...

Bash的環境變數

一 環境變數與使用者自定義變數的區別 使用者自定義變數只在當前的shell中生效 環境變數在當前shell和這個shell的所有自shell中生效 對系統生效的環境名和變數作用是固定的。環境變數和使用者自定義變數最主要的區別在於,環境變數是全域性變數,而使用者自定義變數是區域性變數。使用者自定義變數...

bash環境變數配置

reference document 鳥哥的linux私房菜 login 與 non login shell 在開始介紹 bash 的配置檔案前,我們一定要先知道的就是 login shell 與 non login shell!重點在於有沒有登入 login 啦!login shell 取得 ba...