linux bash環境變量簡單總結

來源鏈接:http://www.178linux.com/8005

原創文章,如有轉載,請註明原文地址

一.環境變量簡介

Linux是一個多用戶的操作系統。每個用戶登錄系統後,都會有一個專用的運行環境。通常每個用戶默認的環境都

是相同的,這個默認環境實際上就是一組環境變量的定義。

環境變量是全局的,設置好的環境變量可以被所有當前用戶所運行的程序所使用。

用戶可以對自己的運行環境進行定製,其方法就是修改相應的系統環境變量。

常見的環境變量:

PATH: 決定了shell將到哪些目錄中尋找命令或程序

ROOTPATH: 這個變量的功能和PATH相同,但它只羅列出超級用戶(root)鍵入命令時所需檢查的目錄。

HOME: 當前用戶主目錄

USER: 查看當前的用戶

LOGNAME: 查看當前用戶的登錄名。

UID: 當前用戶的識別字,取值是由數位構成的字串。

SHELL: 是指當前用戶用的是哪種Shell。

TERM : 終端的類型。

PWD 當前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。

MAIL: 是指當前用戶的郵件存放目錄。

HISTSIZE: 是指保存歷史命令記錄的條數

HOSTNAME: 是指主機的名稱,許多應用程序如果要用到主機名的話,通常是從這個環境變量中來取得的。

PS1: 是基本提示符,對於root用戶是#,對於普通用戶是$,也可以使用一些更復雜的值。

PS2: 是附屬提示符,默認是“>”。可以通過修改此環境變量來修改當前的命令符,比如下列命令會將提示符

修改成字符串“Hello,My NewPrompt :) ”。# PS1=" Hello,My NewPrompt :) "

IFS: 輸入域分隔符。當shell讀取輸入時,用來分隔單詞的一組字符,它們通常是空格、製表符和換行符。

語言及環境字符集相關的重要環境變量:

相關命令:

stty 顯示或設定文字終端設置,主要是按鍵的代表意義

locale (local environment)查看當前的語系信息

【注:locale -a :查看當前系統所支持的字符集】

LANG 沒有設置任何LC_XXX變量時所使用的默認值。

【LANG=zh.CN.UTF-8 gedit a.txt //臨時採用其它字符集語言打開指定的應用程序】

LC_ALL 用來覆蓋掉所有其他LC_XXX變量的值

LC_COLLATE 使用所指定地區的排序規則

LC_CTYPE 使用指定地區的字符集(即:字母,數字,標點符號等)

LC_MESSAGES 使用所指定地區的響應與信息;【注:僅POSIX適用】

LC_MONETARY 使用指定地區的貨幣格式

LC_NUMERIC 使用指定地區的數字格式

LC_TIME 使用指定地區的日期與時間格式。

不太常用的實用環境變量:

LD_LIBRARY_PATH 這個變量包含了一系列用冒號隔開的目錄,動態鏈接器將在這些目錄裏查找庫文件。
MANPATH 這個變量包含了一系列用冒號隔開的目錄,命令man會在這些目錄裏搜索man頁面。
【注:man幫助目錄結構必須爲:man/{man1,man2,..man8}, MANPATH=/man】
INFODIR 這個變量包含了一系列用冒號隔開的目錄,命令info將在這些目錄裏搜索info頁面。
PAGER 這個變量包含了瀏覽文件內容的程序的路徑(例如less或者more)。
EDITOR 這個變量包含了修改文件內容的程序(文件編輯器)的路徑(比如nano或者vi)。

系統位置變量—【僅用於shell腳本中獲取命令行傳遞給腳本的參數】

$0、$1 $2 $3 $4 $5 $6 $7 $8 $9,$* ——>$0到9與windows中0~9的含義一樣。

$0:當前執行Shell文件名

$#:命令行中位置參數的個數

$*:獲取當前shell的所有參數

$@:此程序的所有參數

系統特殊變量

$?:上一條命令執行後返回的狀態,當返回值爲0:表執行正常,非0:執行異常或出錯

程序執行,可能有兩類返回值:

》0:正確執行

》1~255:錯誤執行。其中1,2,127 是系統預留錯誤代碼,可自行使用

$$:當前所在進程的進程號 【$$變量最常見的用途是用做暫存文件的名字以保證暫存文件不會重複。】

$!:後臺運行的最後一個進程號

$_:在此之前執行命令或腳本的最後一個參數

引號對變量賦值的影響:

》雙引號“”:允許通過$符號引用其他變量值

》單引號‘’: 禁止引用其他變量值,$視爲普通字符

》反撇號` `:將命令執行的結果變輸出給變量 ,

$(…) :這是反撇號的另一種版本。

二.Bash(Bourne-Again Shell)簡介

Bash是許多Linux平臺的內定Shell,事實上,還有許多傳統UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh

等等。Shell Script大致都類同,當您學會一種Shell以後,其它的Shell會很快就上手。

大多數的時候,一個Shell Script通常可以在很多種Shell上使用。

通常而言,shell的功能是從終端或其它輸入取得命令行,將其解析爲一系列操作指令,調用系統內核或相應的

外部程序執行,然後將執行結果返回給終端或其它輸出。因此,實現一個簡單的shell是一項容易的工作。

但bash的功能不僅限於此,它支持用管道和重定向協同執行命令,提供了強大的腳本編程能力,

具備作業管理功能。一般的Linux發行版中,bash的可執行文件往往是/bin中最大的幾個實用程序之一,

客觀反映了它的複雜性。

三.Bash實現原理簡介

bash使用GNU Readline庫處理用戶命令輸入,Readline提供類似於vi或emacs的行編輯功能。

bash運行時的調度中心是其主控循環。主控循環的功能較爲簡單,它循環讀取用戶(或腳本)輸入,傳遞給

語法分析器,同時處理下層遞歸返回的錯誤。

語法分析器對文本形式的輸入首先進行通配符、別名、算術和變量展開等工作,然後通過命令生成器得到

規範的命令結構,並由專門的重定向處理機制填寫重定向語義,交由命令執行器執行。命令執行器依據

命令種類不同,執行內部命令函數、外部程序或文件系統調用。在命令執行過程中,執行器要對系統信號

進行捕獲和處理。在支持作業管理的操作系統中,命令執行器將進程信息加入作業控制機制,並允許用戶

使用內部命令或鍵盤信號來啓停作業。如果在不支持作業管理的操作系統中編譯bash,會使用另一套接口

相同的機制對進程信息進行簡單的維護。

四.Shell和環境變量的關係

環境變量是和Shell緊密相關的,環境變量是通過Shell命令來設置的。用戶登錄系統後就啓動了一個Shell。

對於Linux來說一般是bash,但也可以重新設定或切換到其它的 Shell。

設置好的環境變量又可以被所有當前用戶所運行的程序所使用。對於bash這個Shell程序來說,可以通過

變量名來訪問相應的環境變量。

Linux 的環境變量具有繼承性,即子shell 會繼承父shell 的環境變量。

當前shell中的變量也叫本地變量,很顯然本地變量中肯定包含環境變量。Linux 的本地變量的非環境變量

不具備繼承性。

五、登錄腳本的執行順序:【注:僅適用於 bash shell】

Login Shell

是指登錄時,需要提供用戶名密碼的shell,如:su – user1 , 圖形登錄, ctrl+alt+F2-6進入的登錄界面。

這種Login shell 執行腳本的順序:

1. /etc/profile 【全局profile文件;它定義了LoginUser的 PATH, USER, LOGNAME(登錄使用者帳號)】

2. /etc/profile.d/目錄下的腳本

3. ~/.bash_profile 【搜索命令的路徑 ——————- 登錄級別 環境變量配置文件 】

4. ~/.bashrc 【存儲用戶設定的別名和函數 ———- shell級別 環境變量配置文件】

5. /etc/bashrc 【全局bashrc文件; 它主要定義一些 Function 和 Alias;更改/etc/bashrc會影響到所有用戶,由root用戶管理。】

Non-Login shell

非登錄shell指的是,不需要輸入用戶名密碼的shell,如圖形下 右鍵terminal,或ctrl+shift+T打開的shell

這種Non-Login shell 執行登錄腳本的順序:

1. ~/.bashrc

2. /etc/bashrc

3. /etc/profile.d/目錄下的腳本

說到用戶腳本就不能不說下,與用戶密切相關的兩個文件:

1. /etc/login.defs —– 它定義了用戶密碼長度,最長使用期,警告天數,密碼加密方法,家目錄默認權限 等。

2. /etc/default/useradd –它定義了創建用戶時,默認家目錄的根,默認shell,從哪裏拷貝必要配置文件,是否創建郵箱等。

/etc/skel –【.bashrc, .bash_profile, .bash_logout等文件都源自這裏】

當用命令添加一個用戶時,它默認會在/home/下新建一個以用戶名爲名的目錄,並把/etc/skel下的文件

copy到這個新用戶的家目錄中。這樣當該用戶登錄時,系統會自動調用這些文件,配置該用戶的登錄環境。

六. 環境變量的應用  操作:

1.變量內容的刪除和替換

${變量#關鍵詞} 從頭開始檢查關鍵詞,將符合的最短數據刪除

${變量##關鍵詞} 從頭開始檢查關鍵詞,將符合的最長數據刪除

${變量%關鍵詞} 從尾開始檢查關鍵詞,將符合的最短數據刪除

${變量%%關鍵詞} 從尾開始檢查關鍵詞,將符合的最長數據刪除

${變量/舊字符串/新字符串} 若符合舊字符串,則第一個舊字符串被替換

${變量//舊字符串/新字符串} 若符合舊字符串,則全部舊字符串被替換

2. 變量內容的設定和替換

一次變量置換:

變量沒有值:

echo ${a:=abc} //若a沒有值,就送給a一個abc,作爲它的值,這時a的值就永久是abc了,直到下次修改。

//下面例子不常用

echo ${a:?必須需要給變量一個值} //若a沒有值,則提示"必須需要給變量一個值"

echo ${a:-abc} //若a沒有值,就借給a一個值,次命令執行完後,a還是空值。

變量有值

echo ${a:+123} //臨時替換變量的值; a=1; expr ${a:+123} – 1;其值爲122

二次變量置換

示例一:

A=B

a=1

B1="B值"

eval echo \$$A$a > B1.txt //注意:這裏不能直接用反撇號獲取二次置換的結果。

C=`cat B1.txt` //如此就可以獲取B1的變量值了.

示例二:

FAIL="echo -e \"\n\e[31m\${FMSG}\e[0m\n\""

FMSG="需要紅色提示顯示的字符串。" && eval ${FAIL}

示例三:

grep的結果:"APPDIR="/home/abc/bin“" 通過eval可以直接將APPDIR轉換爲賦值語句執行。

eval `grep '^ .*APPDIR' /etc/tuxconfig`

echo ${APPDIR} //這樣就可以輸出APPDIR的值。

七.一些Shell內置命令

1.source命令

作用:在當前bash環境下讀取並執行FileName中的命令,使環境變量生效。

注:該命令通常用命令“.”來替代。

例如:

source ~/.bash_profile

2.export :

用於把變量變成當前shell和其子shell的環境變量,存活期是當前的shell及其子shell,因此重新登陸或者關閉當前

shell及其子shell後,它所設定的環境變量就消失了。

3.env和printenv

這兩個變量用於打印所有的環境 變量:

4.set

用於顯示與設置當前本地 變量。單獨一個set 就顯示了當前環境的所有的變量,它肯定包括環境變量和一些非環境變量

5.unset
用於清除變量。不管這個變量是環境變量還是本地變量,它都可以清除。

八.其它與變量相關的小知識

shell : 屬於弱類型語言,變量可直接使用,不需要聲明和初始化。

對於強類型語言,則必須在使用變量前先聲明,甚至需要初始化,因爲變量不初始化其值爲隨機數。

變量: 它是內存空間的一個別名,這個別名映射的是內存的存儲單元的編址。

數組:是一個命名的連續的內存空間

Shell的變量類型: 是事先確定數據的存儲格式和長度。

字符: 是按照ASCII存儲;一個字符串10,是存儲爲兩個ASCII碼,佔16bit。

數值:

1.整型: 如10,它存儲時,是轉爲二進制1010,佔4bit,實際佔8bit.

2.浮點型: “11.23”,它在存儲時,是會轉爲兩部分存放,

一般爲數值和小數點位置,如11.23–>0.1123*10^2,存儲時僅存1123和次方數2.

如:2014/11/11在存放時,它是若按字符串存64bit.

如按數值存則採用2014/11/11 – 1977/1/1 = N, 它若存N這個數值,需要的空間最多24bit.

變量溢出:

一個整型是8bit,可存放的值有256個,範圍是0-255,但若一個整型中存放了256,最怎樣?結果就是變量溢出,

8bit中存的是全0,1溢出了,溢出之後1被存放到其它程序的存儲空間中了,它可能覆蓋其它程序的數據。

這看上去沒有任何意義,但若是一個設計精良的溢出值,則可能會因此覆蓋掉某些程序的一部分內存空間

從而輕易的獲取該程序的控制權,若該程序是系統進程,則它將可能獲取系統權限

shell中數組相關操作: —【注:shell中的數組不能做爲export導出的對象,因此它僅不能作爲環境變量】

變量名=(Value1 Value2 Value3 Value4)

a=(1 2 3 4 5)

例子:

Cpu(s): 1.0%us, 0.5%sy, 0.0%ni, 98.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

a=(`top -n5 -d1 | awk '$1~/Cpu\(s\):/{print $2}' | awk -F'%' '{print $1}' | xargs -n5`)

查數組成員數

echo ${#a[*]} —>前面加“#”,表示查看數組有多少個成員

查看成員值

echo ${a[0]} —>第一個數組成員的值爲 1.

echo ${a[*]} 或 echo ${a[@]} —>查看所以成員的值

declare -p a —>查看所有數組成員。

echo ${a[*]:1:3} —>查看數組中下標爲1~3的成員值


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章