Shell環境變數
1)變數型別
1)變數可分為倆類:環境變數(全域性變數),和普通變數(區域性變數),
環境變數也稱為全域性變數,可以在建立他們的Shell及其派生出來的任意子程序Shell中使用,環境變數又可以分為自定義環境變數和bash內建的環境變數,環境變數可以在命令列中設定和建立,使用者退出命令列時這些變數值就會丟失,想要永久儲存環境變數,可在使用者家目錄下的 . bash_profile 或 . bashrc (非使用者登入模式特有,如:SSH)檔案中,或在/etc/profile檔案中定義,這樣每次使用者登入時這些變數都將被初始化。
普通變數也可成為區域性變數,只能在建立它們的Shell函式或Shell指令碼中使用,普通變數一般由開發者在開發指令碼程式時建立,
2)檢視設定的變數
set命令輸出所有的變數,包括全域性變數和區域性變數
1[root@king ~]# set 2APACHEERR=hello world 3BASH=/bin/bash 4BASH_ALIASES=() 5BASH_ARGC=() 6BASH_ARGV=() 7BASH_CMDS=() 8BASH_LINENO=() 9BASH_SOURCE=() 10BASH_VERSINFO=([0]="4" [1]="1" [2]="2" [3]="1" 11中間和結尾省略若干程式碼
env(printenv)命令只顯示全域性變數,
1 [king@king~]$ env 2 HOSTNAME=king 3 SHELL=/bin/bash#大家可以自行檢視一下哦
declare命令輸出所有的變數,函式,整數,和已經匯出的變數,set -o命令顯示bashShell的所有引數配置資訊
3)自定義環境變數
如果想設定環境變數,就要給在給變數賦值後或在設定變數時使用export命令,export命令和declare命令的格式:
- export 變數名=value
- 變數名=value ; export 變數名
- declare - x 變數名=value
小試牛刀:定義環境變數並賦值的方法:
- export NAME=qzlking
- declare -x NAME=qzlking
- NAME=qzlking ; exprot NAME
1 [root@king script]# cat /etc/profile|grep qzl 2export qzl='qzlking' #<==編輯/etc/profile,然後輸出此行並儲存 3 [root@king script]# source /etc/profile#<==或./etc/profile使其生效 4 [root@king script]# echo $qzl#<==在變數前加$符號並列印變數值 5qzlking 6 [root@king script]# env|grep qzl#<==檢視定義結果 7qzl=qzlking
我們一起來看一下讓環境變數永久生效的常用配置檔案
a)使用者環境變數配置
1 [root@king scripts]# ls /root/.bashrc 2 /root/.bashrc 3 [root@king scripts]# ls /root/.bash_profile 4 /root/.bash_profile
說明:對於使用者的環境變數設定,常見的是使用者家目錄下的.bashrc和.bash_profile。
b)全域性環境變數的配置
常見的全域性環境變數配置檔案, / etc/profile ; /etc/bashrc ; /etc/profile.d 這三個配置檔案,如果想要在登陸後初始化或者顯示載入的內容,只需要把指令碼檔案放在/etc/profile.d檔案下即可(不需要加執行許可權)。
在Java環境中,自定義環境變數,通常放在/etc/profile全域性環境變數裡哦,
1 export JAVA_HOME=/application/jdk 2 export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib 3 export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin 4 export RESIN_HOME=/application/resin
4)檢視/取消環境變數
我們通常在工作中要檢視一下環境變數中都配置了什麼,需要做什麼更改,所以我們就有了ehco或printf命令來列印檢視環境變數。
- $HOME:使用者登入時進入的目錄
- $UID:當前使用者的uid( 也就是使用者的標識,相當於人的身份證)相當於id -u
1 [king@king ~]$ echo $HOME 2 /home/king 3 [king@king ~]$ echo $UID 4 300
我們可以用unset來消除本地變數和環境變數
1 [king@king ~]$ echo $USER 2 nane 3 [king@king ~]$ unset $USER 4 [king@king ~]$ echo$USER#<這裡輸出是個空行 5
小結:
- 變數名一定要大寫,可以在自身的Shell及子Shell中使用,常用export來定義環境變數
- 執行enc預設可以顯示所有的環境變數名稱及對應的值
- 輸出時用“$變數名”,取消用“unset 變數名”
2)環境變數初始化與對應檔案的生效順序
1.登陸Shell讀取環境變數檔案的流程
使用者登入系統後首先會載入/etc/profile全域性環境變數檔案,載入完後,執行/etc/profile.d目錄下的指令碼檔案(如:系統的字符集設定/etc/sysconfigil8n),然後在執行$HOME/.bash_profile(使用者環境變數檔案),在這檔案裡會找$HOME/.bashrc(使用者環境變數檔案),有就執行,沒有就不執行。在$HOME/.bashrc找/etc/bashrc(全域性環境變數檔案)有就執行,沒有就不執行。如果希望使用者的Shell不是登陸時啟動的(如:手動敲下bash時啟動或者遠端ssh連線情況),非登陸Shell只會載入$HOME/.bashrc(使用者環境變數檔案),並會去找/etc/bashrc(全域性環境變數檔案)。即非登陸Shell想讀到設定的環境變數,需要將變數設定等寫入$HOME/.bashrc(使用者環境變數檔案)或etc/bashrc(全域性環境變數檔案)不是$HOME/.bash_profile或/etc/profile。。。
3)定義本地變數
1)普通變數的定義,有三種寫法
- 變數名=value #不加引號時,值裡有變數的會被解析後輸出。
- 變數名='value' #輸出變數內容時單引號裡是什麼就輸出什麼,不管什麼都原樣輸出。
- 變數名="value" #輸出變數內容時引號裡的變數和命令經過解析後輸出。
2)命令結果作為的變數內容來賦值
- 變數名=`mkdir` #這裡是反引號,
- 變數名=$(mkdir) #把命令$()括起來,來賦值。
4)變數定義的技巧總結
- 變數名只能為字母,數字或者下劃線,只能以字母或下劃線開頭,要見名知意。
- 一般變數的定義,賦值常用雙引號,希望原樣輸出的加單引號。
- 希望變數的內容是命令的解析結果時,要用反引號``,或者用$()把命令括起來在賦值
- 列印輸出或使用變數時,變數名前要接$符號。
變數定定義示例:
1 KingAge=25#<==每個單詞的首字母大寫的寫法 2 king_age=25#<==單詞之間用"_"的寫法 3 kingAgeSex=25#<==駝峰語法: 首個單詞的首字母小寫,其餘單詞首字母大寫 4 kingAGE=25#<==單詞全大寫的寫法