一.環(huán)境變量簡介linux是一個(gè)多用戶的操作系統(tǒng)。每個(gè)用戶登錄系統(tǒng)后,都會(huì)有一個(gè)專用的運(yùn)行環(huán)境。通常每個(gè)用戶默認(rèn)的環(huán)境都 是相同的,這個(gè)默認(rèn)環(huán)境實(shí)際上就是一組環(huán)境變量的定義。 環(huán)境變量是全局的,設(shè)置好的環(huán)境變量可以被所有當(dāng)前用戶所運(yùn)行的程序所使用。 用戶可以對自己的運(yùn)行環(huán)境進(jìn)行定制,其方法就是修改相應(yīng)的系統(tǒng)環(huán)境變量。 常見的環(huán)境變量:PATH: 決定了shell將到哪些目錄中尋找命令或程序ROOTPATH: 這個(gè)變量的功能和PATH相同,但它只羅列出超級(jí)用戶(root)鍵入命令時(shí)所需檢查的目錄。HOME: 當(dāng)前用戶主目錄USER: 查看當(dāng)前的用戶LOGNAME: 查看當(dāng)前用戶的登錄名。UID: 當(dāng)前用戶的識(shí)別字,取值是由數(shù)位構(gòu)成的字串。SHELL: 是指當(dāng)前用戶用的是哪種Shell。TERM : 終端的類型。PWD 當(dāng)前工作目錄的絕對路徑名,該變量的取值隨cd命令的使用而變化。MAIL: 是指當(dāng)前用戶的郵件存放目錄。HISTSIZE: 是指保存歷史命令記錄的條數(shù)HOSTNAME: 是指主機(jī)的名稱,許多應(yīng)用程序如果要用到主機(jī)名的話,通常是從這個(gè)環(huán)境變量中來取得的。PS1: 是基本提示符,對于root用戶是#,對于普通用戶是$,也可以使用一些更復(fù)雜的值。PS2: 是附屬提示符,默認(rèn)是“>”。可以通過修改此環(huán)境變量來修改當(dāng)前的命令符,比如下列命令會(huì)將提示符 修改成字符串“Hello,My NewPRompt
”。# PS1=" Hello,My NewPrompt
"IFS: 輸入域分隔符。當(dāng)shell讀取輸入時(shí),用來分隔單詞的一組字符,它們通常是空格、制表符和換行符。
語言及環(huán)境字符集相關(guān)的重要環(huán)境變量: 相關(guān)命令: stty 顯示或設(shè)定文字終端設(shè)置,主要是按鍵的代表意義 locale (local environment)查看當(dāng)前的語系信息 【注:locale -a :查看當(dāng)前系統(tǒng)所支持的字符集】 LANG 沒有設(shè)置任何LC_XXX變量時(shí)所使用的默認(rèn)值。 【LANG=zh.CN.UTF-8 gedit a.txt //臨時(shí)采用其它字符集語言打開指定的應(yīng)用程序】 LC_ALL 用來覆蓋掉所有其他LC_XXX變量的值 LC_COLLATE 使用所指定地區(qū)的排序規(guī)則 LC_CTYPE 使用指定地區(qū)的字符集(即:字母,數(shù)字,標(biāo)點(diǎn)符號(hào)等) LC_MESSAGES 使用所指定地區(qū)的響應(yīng)與信息;【注:僅POSIX適用】 LC_MONETARY 使用指定地區(qū)的貨幣格式 LC_NUMERIC 使用指定地區(qū)的數(shù)字格式 LC_TIME 使用指定地區(qū)的日期與時(shí)間格式。
不太常用的實(shí)用環(huán)境變量: LD_LIBRARY_PATH 這個(gè)變量包含了一系列用冒號(hào)隔開的目錄,動(dòng)態(tài)鏈接器將在這些目錄里查找?guī)煳募! ANPATH 這個(gè)變量包含了一系列用冒號(hào)隔開的目錄,命令man會(huì)在這些目錄里搜索man頁面。 【注:man幫助目錄結(jié)構(gòu)必須為:man/{man1,man2,..man8}, MANPATH=/man】 INFODIR 這個(gè)變量包含了一系列用冒號(hào)隔開的目錄,命令info將在這些目錄里搜索info頁面。 PAGER 這個(gè)變量包含了瀏覽文件內(nèi)容的程序的路徑(例如less或者more)。 EDITOR 這個(gè)變量包含了修改文件內(nèi)容的程序(文件編輯器)的路徑(比如nano或者vi)。
系統(tǒng)位置變量—【僅用于shell腳本中獲取命令行傳遞給腳本的參數(shù)】 $0、$1 $2 $3 $4 $5 $6 $7 $8 $9,$* ——>$0到9與windows中0~9的含義一樣。 $0:當(dāng)前執(zhí)行Shell文件名 $#:命令行中位置參數(shù)的個(gè)數(shù) $*:獲取當(dāng)前shell的所有參數(shù) $@:此程序的所有參數(shù)
系統(tǒng)特殊變量 $?:上一條命令執(zhí)行后返回的狀態(tài),當(dāng)返回值為0:表執(zhí)行正常,非0:執(zhí)行異常或出錯(cuò) 程序執(zhí)行,可能有兩類返回值: 》0:正確執(zhí)行 》1~255:錯(cuò)誤執(zhí)行。其中1,2,127 是系統(tǒng)預(yù)留錯(cuò)誤代碼,可自行使用 $$:當(dāng)前所在進(jìn)程的進(jìn)程號(hào) 【$$變量最常見的用途是用做暫存文件的名字以保證暫存文件不會(huì)重復(fù)。】 $!:后臺(tái)運(yùn)行的最后一個(gè)進(jìn)程號(hào) $_:在此之前執(zhí)行命令或腳本的最后一個(gè)參數(shù) 引號(hào)對變量賦值的影響: 》雙引號(hào)“”:允許通過$符號(hào)引用其他變量值 》單引號(hào)‘’: 禁止引用其他變量值,$視為普通字符 》反撇號(hào)` `:將命令執(zhí)行的結(jié)果變輸出給變量 , $(…) :這是反撇號(hào)的另一種版本。 二.Bash(Bourne-Again Shell)簡介 Bash是許多Linux平臺(tái)的內(nèi)定Shell,事實(shí)上,還有許多傳統(tǒng)UNIX上用的Shell,像tcsh、csh、ash、bsh、ksh 等等。Shell Script大致都類同,當(dāng)您學(xué)會(huì)一種Shell以后,其它的Shell會(huì)很快就上手。 大多數(shù)的時(shí)候,一個(gè)Shell Script通常可以在很多種Shell上使用。 通常而言,shell的功能是從終端或其它輸入取得命令行,將其解析為一系列操作指令,調(diào)用系統(tǒng)內(nèi)核或相應(yīng)的 外部程序執(zhí)行,然后將執(zhí)行結(jié)果返回給終端或其它輸出。因此,實(shí)現(xiàn)一個(gè)簡單的shell是一項(xiàng)容易的工作。 但bash的功能不僅限于此,它支持用管道和重定向協(xié)同執(zhí)行命令,提供了強(qiáng)大的腳本編程能力, 具備作業(yè)管理功能。一般的Linux發(fā)行版中,bash的可執(zhí)行文件往往是/bin中最大的幾個(gè)實(shí)用程序之一, 客觀反映了它的復(fù)雜性。 三.Bash實(shí)現(xiàn)原理簡介 bash使用GNU Readline庫處理用戶命令輸入,Readline提供類似于vi或emacs的行編輯功能。 bash運(yùn)行時(shí)的調(diào)度中心是其主控循環(huán)。主控循環(huán)的功能較為簡單,它循環(huán)讀取用戶(或腳本)輸入,傳遞給 語法分析器,同時(shí)處理下層遞歸返回的錯(cuò)誤。 語法分析器對文本形式的輸入首先進(jìn)行通配符、別名、算術(shù)和變量展開等工作,然后通過命令生成器得到 規(guī)范的命令結(jié)構(gòu),并由專門的重定向處理機(jī)制填寫重定向語義,交由命令執(zhí)行器執(zhí)行。命令執(zhí)行器依據(jù) 命令種類不同,執(zhí)行內(nèi)部命令函數(shù)、外部程序或文件系統(tǒng)調(diào)用。在命令執(zhí)行過程中,執(zhí)行器要對系統(tǒng)信號(hào) 進(jìn)行捕獲和處理。在支持作業(yè)管理的操作系統(tǒng)中,命令執(zhí)行器將進(jìn)程信息加入作業(yè)控制機(jī)制,并允許用戶 使用內(nèi)部命令或鍵盤信號(hào)來啟停作業(yè)。如果在不支持作業(yè)管理的操作系統(tǒng)中編譯bash,會(huì)使用另一套接口 相同的機(jī)制對進(jìn)程信息進(jìn)行簡單的維護(hù)。
四.Shell和環(huán)境變量的關(guān)系 環(huán)境變量是和Shell緊密相關(guān)的,環(huán)境變量是通過Shell命令來設(shè)置的。用戶登錄系統(tǒng)后就啟動(dòng)了一個(gè)Shell。 對于Linux來說一般是bash,但也可以重新設(shè)定或切換到其它的 Shell。 設(shè)置好的環(huán)境變量又可以被所有當(dāng)前用戶所運(yùn)行的程序所使用。對于bash這個(gè)Shell程序來說,可以通過
變量名來訪問相應(yīng)的環(huán)境變量。 Linux 的環(huán)境變量具有繼承性,即子shell 會(huì)繼承父shell 的環(huán)境變量。 當(dāng)前shell中的變量也叫本地變量,很顯然本地變量中肯定包含環(huán)境變量。Linux 的本地變量的非環(huán)境變量 不具備繼承性。
五、登錄腳本的執(zhí)行順序:【注:僅適用于 bash shell】 Login Shell 是指登錄時(shí),需要提供用戶名密碼的shell,如:su – user1 , 圖形登錄, ctrl+alt+F2-6進(jìn)入的登錄界面。 這種Login shell 執(zhí)行腳本的順序: 1. /etc/profile 【全局profile文件;它定義了LoginUser的 PATH, USER, LOGNAME(登錄使用者帳號(hào))】 2. /etc/profile.d/目錄下的腳本 3. ~/.bash_profile 【搜索命令的路徑 ——————- 登錄級(jí)別 環(huán)境變量配置文件 】 4. ~/.bashrc 【存儲(chǔ)用戶設(shè)定的別名和函數(shù) ———- shell級(jí)別 環(huán)境變量配置文件】 5. /etc/bashrc 【全局bashrc文件; 它主要定義一些 Function 和 Alias;更改/etc/bashrc會(huì)影響到所有用戶,由root用戶管理。】 Non-Login shell 非登錄shell指的是,不需要輸入用戶名密碼的shell,如圖形下 右鍵terminal,或ctrl+shift+T打開的shell 這種Non-Login shell 執(zhí)行登錄腳本的順序: 1. ~/.bashrc 2. /etc/bashrc 3. /etc/profile.d/目錄下的腳本
說到用戶腳本就不能不說下,與用戶密切相關(guān)的兩個(gè)文件: 1. /etc/login.defs —– 它定義了用戶密碼長度,最長使用期,警告天數(shù),密碼加密方法,家目錄默認(rèn)權(quán)限 等。 2. /etc/default/useradd –它定義了創(chuàng)建用戶時(shí),默認(rèn)家目錄的根,默認(rèn)shell,從哪里拷貝必要配置文件,是否創(chuàng)建郵箱等。 /etc/skel –【.bashrc, .bash_profile, .bash_logout等文件都源自這里】 當(dāng)用命令添加一個(gè)用戶時(shí),它默認(rèn)會(huì)在/home/下新建一個(gè)以用戶名為名的目錄,并把/etc/skel下的文件 copy到這個(gè)新用戶的家目錄中。這樣當(dāng)該用戶登錄時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用這些文件,配置該用戶的登錄環(huán)境。
六. 環(huán)境變量的應(yīng)用 和 操作: 1.變量內(nèi)容的刪除和替換 ${變量#關(guān)鍵詞} 從頭開始檢查關(guān)鍵詞,將符合的最短數(shù)據(jù)刪除 ${變量##關(guān)鍵詞} 從頭開始檢查關(guān)鍵詞,將符合的最長數(shù)據(jù)刪除 ${變量%關(guān)鍵詞} 從尾開始檢查關(guān)鍵詞,將符合的最短數(shù)據(jù)刪除 ${變量%%關(guān)鍵詞} 從尾開始檢查關(guān)鍵詞,將符合的最長數(shù)據(jù)刪除 ${變量/舊字符串/新字符串} 若符合舊字符串,則第一個(gè)舊字符串被替換 ${變量//舊字符串/新字符串} 若符合舊字符串,則全部舊字符串被替換
2. 變量內(nèi)容的設(shè)定和替換 一次變量置換: 變量沒有值: echo ${a:=abc} //若a沒有值,就送給a一個(gè)abc,作為它的值,這時(shí)a的值就永久是abc了,直到下次修改。 //下面例子不常用 echo ${a:?必須需要給變量一個(gè)值} //若a沒有值,則提示"必須需要給變量一個(gè)值" echo ${a:-abc} //若a沒有值,就借給a一個(gè)值,次命令執(zhí)行完后,a還是空值。 變量有值 echo ${a:+123} //臨時(shí)替換變量的值; a=1; expr ${a:+123} – 1;其值為122
二次變量置換 示例一: A=B a=1 B1="B值" eval echo /$$A$a > B1.txt //注意:這里不能直接用反撇號(hào)獲取二次置換的結(jié)果。 C=`cat B1.txt` //如此就可以獲取B1的變量值了.
示例二: FAIL="echo -e /"/n/e[31m/${FMSG}/e[0m/n/"" FMSG="需要紅色提示顯示的字符串。" && eval ${FAIL}
示例三: grep的結(jié)果:"APPDIR="/home/abc/bin“" 通過eval可以直接將APPDIR轉(zhuǎn)換為賦值語句執(zhí)行。 eval `grep '^ .*APPDIR' /etc/tuxconfig` echo ${APPDIR} //這樣就可以輸出APPDIR的值。
七.一些Shell內(nèi)置命令 1.source命令 作用:在當(dāng)前bash環(huán)境下讀取并執(zhí)行FileName中的命令,使環(huán)境變量生效。 注:該命令通常用命令“.”來替代。 例如: source ~/.bash_profile 2.export : 用于把變量變成當(dāng)前shell和其子shell的環(huán)境變量,存活期是當(dāng)前的shell及其子shell,因此重新登陸或者關(guān)閉當(dāng)前 shell及其子shell后,它所設(shè)定的環(huán)境變量就消失了。 3.env和printenv 這兩個(gè)變量用于打印所有的環(huán)境 變量: 4.set 用于顯示與設(shè)置當(dāng)前本地 變量。單獨(dú)一個(gè)set 就顯示了當(dāng)前環(huán)境的所有的變量,它肯定包括環(huán)境變量和一些非環(huán)境變量 5.unset 用于清除變量。不管這個(gè)變量是環(huán)境變量還是本地變量,它都可以清除。
八.其它與變量相關(guān)的小知識(shí) shell : 屬于弱類型語言,變量可直接使用,不需要聲明和初始化。 對于強(qiáng)類型語言,則必須在使用變量前先聲明,甚至需要初始化,因?yàn)樽兞坎怀跏蓟?#20540;為隨機(jī)數(shù)。 變量: 它是內(nèi)存空間的一個(gè)別名,這個(gè)別名映射的是內(nèi)存的存儲(chǔ)單元的編址。 數(shù)組:是一個(gè)命名的連續(xù)的內(nèi)存空間 Shell的變量類型: 是事先確定數(shù)據(jù)的存儲(chǔ)格式和長度。 字符: 是按照ASCII存儲(chǔ);一個(gè)字符串10,是存儲(chǔ)為兩個(gè)ASCII碼,占16bit。 數(shù)值: 1.整型: 如10,它存儲(chǔ)時(shí),是轉(zhuǎn)為二進(jìn)制1010,占4bit,實(shí)際占8bit. 2.浮點(diǎn)型: “11.23”,它在存儲(chǔ)時(shí),是會(huì)轉(zhuǎn)為兩部分存放, 一般為數(shù)值和小數(shù)點(diǎn)位置,如11.23–>0.1123*10^2,存儲(chǔ)時(shí)僅存1123和次方數(shù)2. 如:2014/11/11在存放時(shí),它是若按字符串存64bit. 如按數(shù)值存則采用2014/11/11 – 1977/1/1 = N, 它若存N這個(gè)數(shù)值,需要的空間最多24bit. 變量溢出: 一個(gè)整型是8bit,可存放的值有256個(gè),范圍是0-255,但若一個(gè)整型中存放了256,最怎樣?結(jié)果就是變量溢出, 8bit中存的是全0,1溢出了,溢出之后1被存放到其它程序的存儲(chǔ)空間中了,它可能覆蓋其它程序的數(shù)據(jù)。 這看上去沒有任何意義,但若是一個(gè)設(shè)計(jì)精良的溢出值,則可能會(huì)因此覆蓋掉某些程序的一部分內(nèi)存空間 從而輕易的獲取該程序的控制權(quán),若該程序是系統(tǒng)進(jìn)程,則它將可能獲取系統(tǒng)權(quán)限
shell中數(shù)組相關(guān)操作: —【注:shell中的數(shù)組不能做為export導(dǎo)出的對象,因此它僅不能作為環(huán)境變量】 變量名=(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`) 查數(shù)組成員數(shù) echo ${#a[*]} —>前面加“#”,表示查看數(shù)組有多少個(gè)成員 查看成員值 echo ${a[0]} —>第一個(gè)數(shù)組成員的值為 1. echo ${a[*]} 或 echo ${a[@]} —>查看所以成員的值 declare -p a —>查看所有數(shù)組成員。
echo ${a[*]:1:3} —>查看數(shù)組中下標(biāo)為1~3的成員值
原文地址:http://www.178linux.com/8005
新聞熱點(diǎn)
疑難解答
圖片精選