1.環境變量正則表達式
$HOME表示的是某個用戶的主目錄。它和波浪號(~)的做用同樣shell
全局環境變量對於shell會話和全部生成的子shell都是可見的。數組
局部變量則只對建立它們的shell可見。bash
查看全局變量用printenv或env編輯器
查看個別環境變量的值用:printenv 環境變量函數
例如:printenv HOME //查看HOME這個環境變量的值spa
2.如何設置環境變量操作系統
設置局部環境變量:命令行
echo $my_variable
my_variable=Hello調試
若變量須要賦含有空格的字符串值,則須要用雙引號""來界定含空格字符串首尾
echo my_variable
my_variable="Hello World"
全部的環境變量名均使用大寫字母,這是bash shell的標準慣例。若是是你本身建立的局部變量或是shell腳本,請使用小寫字母。變量名區分大小寫。在涉及用戶定義的局部變量時堅持使用小寫字母,這可以避免從新定義系統環境變量可能帶來的災難。
設置了局部環境變量後,就能在shell進程的任何地方使用它了。可是,若是生成了另一個shell,它在子shell中就不可用。
建立全局變量的方法是:先建立一個局部變量,而後在導出到全局環境中(該過程由export完成,變量名前不須要加$):
my_variable="I am Global Now"
export my_variable
在定義並導出變量my_variable後,bash命令啓動了一個子shell。在這個子shell中可以正確顯示出全局環境變量my_variable的值。子shell隨後改變了這個變量的值。可是這種改變僅在子shell中有效,並不會被反映到父shell中。子shell甚至沒法使用export命令改變父shell中全局環境變量的值。
使用unset刪除環境變量,不需加$
unset my_variable
關於使用$:若是要用到變量,使用$;若是要操做變量,不使用$。
系統自有的變量:
CDPATH 冒號分隔的目錄列表,做爲cd命令的搜索路徑
HOME 當前用戶的主目錄
IFS shell用來將文本字符串分割成字段的一系列字符
MAIL 當前用戶收件箱的文件名(bash shell會檢查這個文件,看看有沒有新郵件)
MAILPATH 冒號分隔的當前用戶收件箱的文件名列表(bash shell會檢查列表中的每一個文件,看看有沒有新郵件)
OPTARG getopts命令處理的最後一個選項參數值
OPTIND getopts命令處理的最後一個選項參數的索引號
PATH shell查找命令的目錄列表,由冒號分隔
PS1 shell命令行界面的主提示符
PS2 shell命令行界面的次提示符
BASH 當前shell實例的全路徑名
BASH_ALIASES 含有當前已設置別名的關聯數組
BASH_ARGC 含有傳入子函數或shell腳本的參數總數的數組變量
BASH_ARCV 含有傳入子函數或shell腳本的參數的數組變量
BASH_CMDS 關聯數組,包含shell執行過的命令的所在位置
BASH_COMMAND shell正在執行的命令或立刻就執行的命令
BASH_ENV 設置了的話,每一個bash腳本會在運行前先嚐試運行該變量定義的啓動文件
BASH_EXECUTION_STRING 使用bash -c選項傳遞過來的命令
BASH_LINENO 含有當前執行的shell函數的源代碼行號的數組變量
BASH_REMATCH 只讀數組,在使用正則表達式的比較運算符=~進行確定匹配(positive match)時,包含了匹配到的模式和子模式
BASH_SOURCE 含有當前正在執行的shell函數所在源文件名的數組變量
BASH_SUBSHELL 當前子shell環境的嵌套級別(初始值是0)
BASH_VERSINFO 含有當前運行的bash shell的主版本號和次版本號的數組變量
BASH_VERSION 當前運行的bash shell的版本號
BASH_XTRACEFD 若設置成了有效的文件描述符(0、一、2),則'set -x'調試選項生成的跟蹤輸出可被重定向。一般用來將跟蹤輸出到一個文件中
BASHOPTS 當前啓用的bash shell選項的列表
BASHPID 當前bash進程的PID
COLUMNS 當前bash shell實例所用終端的寬度
COMP_CWORD COMP_WORDS變量的索引值,後者含有當前光標的位置
COMP_LINE 當前命令行
COMP_POINT 當前光標位置相對於當前命令起始的索引
COMP_KEY 用來調用shell函數補全功能的最後一個鍵
COMP_TYPE 一個整數值,表示所嘗試的補全類型,用以完成shell函數補全
COMP_WORDBREAKS Readline庫中用於單詞補全的詞分隔字符
COMP_WORDS 含有當前命令行全部單詞的數組變量
COMPREPLY 含有由shell函數生成的可能填充代碼的數組變量
COPROC 佔用未命名的協進程的I/O文件描述符的數組變量
DIRSTACK 含有目錄棧當前內容的數組變量
EMACS 設置爲't'時,代表emacs shell緩衝區正在工做,而行編輯功能被禁止
ENV 若是設置了該環境變量,在bash shell腳本運行以前會先執行已定義的啓動文件(僅用於當bash shell以POSIX模式被調用時)
EUID 當前用戶的有效用戶ID(數字形式)
FCEDIT 供fc命令使用的默認編輯器
FIGNORE 在進行文件名補全時能夠忽略後綴名列表,由冒號分隔
FUNCNAME 當前執行的shell函數的名稱
FUNCNEST 當設置成非零值時,表示所容許的最大函數嵌套級數(一旦超出,當前命令即被終止)
GLOBIGNORE 冒號分隔的模式列表,定義了在進行文件名擴展時能夠忽略的一組文件名
GROUPS 含有當前用戶屬組列表的數組變量
histchars 控制歷史記錄擴展,最多可有3個字符
HISTCMD 當前命令在歷史記錄中的編號
HISTCONTROL 控制哪些命令留在歷史記錄列表中
HISTFILE 保存shell歷史記錄列表的文件名(默認是.bash_history)
HISTFILESIZE 最多在歷史文件中存多少行
HISTTIMEFORMAT 若是設置了且非空,就用做格式化字符串,以顯示bash歷史中每條命令的時間戳
HISTIGNORE 由冒號分隔的模式列表,用來決定歷史文件中哪些命令會被忽略
HISTSIZE 最多在歷史文件中存多少條命令
HOSTFILE shell在補全主機名時讀取的文件名稱
HOSTNAME 當前主機的名稱
HOSTTYPE 當前運行bash shell的機器
IGNOREEOF shell在退出前必須收到連續的EOF字符的數量(若是這個值不存在,默認是1)
INPUTRC Readline初始化文件名(默認是.inputrc)
LANG shell的語言環境類別
LC_ALL 定義了一個語言環境類別,可以覆蓋LANG變量
LC_COLLATE 設置對字符串排序時用的排序規則
LC_CTYPE 決定如何解釋出如今文件名擴展和模式匹配中的字符
LC_MESSAGES 在解釋前面帶有$的雙引號字符串時,該環境變量決定了所採用的語言環境設置
LC_NUMERIC 決定着格式化數字時採用的語言環境設置
LINENO 當前執行的腳本的行號
LINES 定義了終端上可見的行數
MACHTYPE 用「CPU-公司-系統」(CPU-company-system)格式定義的系統類型
MAPFILE 一個數組變量,當mapfile命令未指定數組變量做爲參數時,它存儲了mapfile所讀入的文本
MAILCHECK shell查看新郵件的頻率(以秒爲單位,默認值是60)
OLDPWD shell以前的工做目錄
OPTERR 設置爲1時,bash shell會顯示getopts命令產生的錯誤
OSTYPE 定義了shell所在的操做系統
PIPESTATUS 含有前臺進程的退出狀態列表的數組變量
POSIXLY_CORRECT 設置了的話,bash會以POSIX模式啓動
PPID bash shell父進程的PID
PROMPT_COMMAND 設置了的話,在命令行主提示符顯示以前會執行這條命令
PROMPT_DIRTRIM 用來定義當啓用了\w或\W提示符字符串轉義時顯示的尾部目錄名的數量。被刪除的目錄名會用一組英文句點替換
PS3 select命令的提示符
PS4 若是使用了bash的-x選項,在命令行以前顯示的提示信息
PWD 當前工做目錄
RANDOM 返回一個0~32767的隨機數(對其的賦值可做爲隨機數生成器的種子)
READLINE_LINE 當使用bind –x命令時,存儲Readline緩衝區的內容
READLINE_POINT 當使用bind –x命令時,表示Readline緩衝區內容插入點的當前位置
REPLY read命令的默認變量
SECONDS 自從shell啓動到如今的秒數(對其賦值將會重置計數器)
SHELL bash shell的全路徑名
SHELLOPTS 已啓用bash shell選項列表,列表項之間以冒號分隔
SHLVL shell的層級;每次啓動一個新bash shell,該值增長1
TIMEFORMAT 指定了shell的時間顯示格式
TMOUT select和read命令在沒輸入的狀況下等待多久(以秒爲單位)。默認值爲0,表示無限長
TMPDIR 目錄名,保存bash shell建立的臨時文件
UID 當前用戶的真實用戶ID(數字形式)
設置PATH環境變量:
PATH=$PATH:新變量位置
對PATH變量的修改只能持續到退出或重啓系統。
3.登陸Shell
登陸shell會從5個不一樣的啓動文件裏讀取命令:
/etc/profile
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
/etc/profile文件是系統上默認的bash shell的主啓動文件。系統上的每一個用戶登陸時都會執行這個啓動文件。
要留意的是:有些Linux發行版使用了可拆卸式認證模塊(Pluggable Authentication Modules ,PAM)。在這種狀況下,PAM文件會在bash shell啓動以前處理,這些文件中可能會包含環境變量。PAM文件包括/etc/environment文件和$HOME/.pam_environment文件。
大部分應用都會建立兩個啓動文件:一個提供bash shell使用(使用.sh擴展名),一個供c shell使用(使用.csh擴展名)
lang.csh和lang.sh文件會嘗試去斷定系統上所採用的默認語言字符集,而後設置對應的LANG環境變量
$HOME目錄下的啓動文件
剩下的啓動文件都起着同一個做用:提供一個用戶專屬的啓動文件來定義該用戶所用到的環境變量。大多數Linux發行版只用這四個啓動文件中的一到兩個:
$HOME/.bash_profile
$HOME/.bashrc
$HOME/.bash_login
$HOME/.profile
注意,這四個文件都以點號開頭,這說明它們是隱藏文件(不會在一般的ls命令輸出列表中出現)。它們位於用戶的HOME目錄下,因此每一個用戶均可以編輯這些文件並添加本身的環境變量,這些環境變量會在每次啓動bash shell會話時生效
說明 Linux發行版在環境文件方面存在的差別很是大。本節中所列出的$HOME下的那些文件並不是每一個用戶都有。例若有些用戶可能只有一個$HOME/.bash_profile文件
shell會按照下列順序,運行第一個被找到的文件,餘下的則被忽略:
$HOME/.bash_profile
$HOME/.bash_login
$HOME/.profile
4.交互式shell進程
若是你的bash shell不是登陸系統時啓動的(好比是在命令行提示符下敲入bash時啓動),那麼你啓動的shell叫做交互式shell。交互式shell不會像登陸shell同樣運行,但它依然提供了命令行提示符來輸入命令。
若是bash是做爲交互式shell啓動的,它就不會訪問/etc/profile文件,只會檢查用戶HOME目錄中的.bashrc文件。
.bashrc文件有兩個做用:一是查看/etc目錄下通用的bashrc文件,二是爲用戶提供一個定製本身的命令別名和私有腳本函數的地方。
5.非交互式 shell
最後一種shell是非交互式shell。系統執行shell腳本時用的就是這種shell。不一樣的地方在於它沒有命令行提示符。可是當你在系統上運行腳本時,也許但願可以運行一些特定啓動的命令。
爲了處理這種狀況,bash shell提供了BASH_ENV環境變量。當shell啓動一個非交互式shell進程時,它會檢查這個環境變量來查看要執行的啓動文件。若是有指定的文件,shell會執行該文件裏的命令,這一般包括shell腳本變量設置。
由父shell設置但並未導出的變量都是局部變量。子shell沒法繼承局部變量。
對於那些不啓動子shell的腳本,變量已經存在於當前shell中了。因此就算沒有設置BASH_ENV,也可使用當前shell的局部變量和全局變量。
6.環境變量持久化
對全局環境變量來講(Linux系統中全部用戶都須要使用的變量),可能更傾向於將新的或修改過的變量設置放在/etc/profile文件中,但這可不是什麼好主意。若是你升級了所用的發行版,這個文件也會跟着更新,那你全部定製過的變量設置可就都沒有了。
最好是在/etc/profile.d目錄中建立一個以.sh結尾的文件。把全部新的或修改過的全局環境變量設置放在這個文件中。
在大多數發行版中,存儲我的用戶永久性bash shell變量的地方是$HOME/.bashrc文件。這一點適用於全部類型的shell進程。但若是設置了BASH_ENV變量,那麼記住,除非它指向的是$HOME/.bashrc,不然你應該將非交互式shell的用戶變量放在別的地方。
圖形化界面組成部分(如GUI客戶端)的環境變量可能須要在另一些配置文件中設置,這和設置bash shell環境變量的地方不同。
7.數組變量
要給某個環境變量設置多個值,能夠把值放在括號裏,值與值之間用空格分隔
例如:mytest=(ine tow three four five)
要引用一個單獨的數組元素,必須用表明它在數組中位置的數值索引值。索引值要用方括號括起來(環境變量數組的索引值都是從零開始)
例如:echo ${mytest[2]}
要顯示整個數組變量,能夠用星號做爲通配符放在索引值的位置
例如:echo ${mytest[*]}
用unset命令刪除索引值上的值的時候,其它索引值不變,被刪除了的索引值內容爲空