來源連接:http://www.178linux.com/8005linux
原創文章,若有轉載,請註明原文地址shell
一.環境變量簡介編程
Linux是一個多用戶的操做系統。每一個用戶登陸系統後,都會有一個專用的運行環境。一般每一個用戶默認的環境都windows
是相同的,這個默認環境實際上就是一組環境變量的定義。數組
環境變量是全局的,設置好的環境變量能夠被全部當前用戶所運行的程序所使用。bash
用戶能夠對本身的運行環境進行定製,其方法就是修改相應的系統環境變量。app
常見的環境變量:less
PATH: 決定了shell將到哪些目錄中尋找命令或程序編輯器
ROOTPATH: 這個變量的功能和PATH相同,但它只羅列出超級用戶(root)鍵入命令時所需檢查的目錄。ide
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 的本地變量的非環境變量
不具有繼承性。
5、登陸腳本的執行順序:【注:僅適用於 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的成員值