很多程式和腳本都通過環境變量來擷取系統資訊、存儲臨時資料和配置資訊。
6.1 什麼是環境變量:
bash shell用一個叫環境變量(environment variable)的特性來存儲有關shell會話和工作環境的資訊。
這項特性允許在記憶體中存儲資料,以便程式能輕松通路到它們。
在bash shell中,分兩類:
全局變量:對于shell會話和所有生成的子shell都是可見的
局部變量:隻對建立的它們的shell可見
6.1.1全局環境變量
檢視全局變量, $env $printenv
檢視某個全局變量:$printenv HOME 或者
$echo $PATH // $後面接變量名。能讓變量作為指令行參數
比如:ls $HOME 相當于 ls /home/xiaochongyong
6.1.2 局部環境變量
隻在定義它們的程序中可見。
可分為:标準的局部變量 和 使用者自定義的局部變量
set:顯示為某個特定程序設定的所有環境變量(包括全局,标準局部,自定義局部),還會按照字母排序。
6.2 設定自定義變量。大小寫敏感的
6.2.1 設定局部自定義變量:盡量用小寫
$my_variable=hello
$echo $ my_variable
$my_variable="hello xcy" // 兩個詞時這麼寫,加"" 。=邊上還不能有空格
父shell中寫了,子shell不一定能用。反之也是。
6.2.1 設定全局環境變量。
設定全局變量的程序所建立的子程序中,該變量都是可見的。
建立方法:
(1)
$my_variable=hello // 建立環境變量
$export my_variable // 導出到全局變量中
(2)export $my_variable=new_hello // 這樣是更改值
子shell無法改到父shell中全局變量的值。隻在目前子shell有效。
6.3删除環境變量
$unset my_variable
子shell中删除了,無法反應到父shell中去。
6.4 預設的shell環境變量。
預設情況下,bash shell中會用一些特定的環境變量來定義系統環境。
這些變量在Linux系統上都已經設定好了。
6.5 設定PATH環境變量
PATH:定義了用于進行指令和程式查找的目錄。
echo $PATH 目錄以冒号隔開。
可以把新的搜尋目錄添加到現有的PATH環境變量中。比如:

gcc hello.c -o xcy
一般隻能 ./xcy 運作
但是加了環境變量之後就可以運作了。
但是切換到别的目錄還是不行。除非這麼加
對PATH的修改隻能持續到退出或重新開機系統,不能一直持續。
6.6 定位系統環境變量
登入系統啟動一個bash shell時,預設情況下bash會在幾個檔案中查找指令。這種檔案叫做啟動檔案或環境檔案。
bash檢查的啟動檔案取決于啟動bash shell 的方式。啟動方式有三種:
1.登入shell:登入系統時,bash shell會作為登入shell啟動。會從5個啟動檔案裡面讀取指令。
(1)/etc/profile (系統預設主啟動檔案,系統上每個使用者登入都會執行這個啟動檔案)
(2)HOME/.bash_profile HOME/.bashrc HOME/.bash_login HOME/.profile
這4個是針對使用者的,提供一個使用者專屬的啟動檔案來定義該使用者所用到的環境變量。
大多數Linux發行版隻用到這四個檔案中的一兩個。不一定每個使用者都有所有檔案。
shell、按照下面的順序運作第一個被找到的檔案,餘下的被忽略:
HOME/.bash_profile
HOME/.bash_login
HOME/.profile
注意上面沒有HOME/.bashrc 。
HOME/.bashrc 這個檔案通常通過其他檔案運作。
我的電腦裡面隻有 HOME/.profile
紅色部分表示檢查HOME目錄是不是有一個.bashrc,如果有就會先執行.bashrc裡面的指令
2.互動式shell程序
不是系統登入時啟動的,比如在終端下直接運作bash。這個就是互動式shell程序。
這種程序不會通路/etc/profile,隻會檢查HOME下的.bashrc
.bashrc有兩個作用:1.檢視/etc目錄下通用的bashrc檔案、2.為使用者提供一個定制自己指令别名和私有腳本函數的地方
3.非互動式shell
系統執行shell腳本時用的就是這種shell。
沒有指令行提示符。
bash shell提供BASH_ENV環境變量。當啟動非互動式shell時,會檢查BASH_ENV來檢視要執行的啟動檔案。如果有,shell會執行裡面的指令。這通常包含shell腳本變量設定。
我的電腦沒有BASH_ENV值。是如何處理的呢?通過繼承父shell的導出過的變量。
比如:父shell是登入shell。在/etc/profile /etc/profile.d/*.sh HOME/.bashrc 檔案中設定并導出了環境變量,用于執行腳本的子shell能繼承這些變量。、
父shell未導出的變量是局部變量,子shell無法繼承。
6.6.4 環境變量持久化
對于全局環境變量,/etc/profile 在更新之後就會沒有。可以在/etc/profile.d 目錄下建立一個.sh結尾的檔案,把所有新的或修改過的全局變量放在這個檔案中
存儲個人永久性bash shell的地方是HOME/.bashrc。
比如之前的給指令取别名,如果放在這裡就可以永遠使用了。
6.7 數組變量。
環境變量可以是數組(從0開始)。比如:
這個用的很少。