1. 介紹shell
任一shell 都獨立保存一份變量列表 ,包括從父shell導出的環境變量和局部變量,能夠根據變量的做用範圍將其簡單地分爲環境變量和局部變量app
環境變量: 能夠在定義它的shell中使用,子shell(子進程)也可繼承使用,能夠簡單的理解爲shell 須要向子shell傳遞內容時使用。但只遵行父>子的傳遞方向,其它方向不成立,如子shell對環境變量的修改不會反應在父shell中。ide
局部變量:只存在於定義它的shell 測試
常常談到的概念,全局變量,內部變量,系統變量,用戶變量,位置參數,本地變量(同局部變量)等,也可歸於環境變量和局部變量, 以免混淆,它們只不量過從另外的角將變量歸類。spa
全局變量:就是環境變量,相對於局部變量而言的環境變量的另外一種叫法。命令行
內部變量:一般指系統定義的一類特殊的環境變量(一般是隻讀類型),一般用戶知道其做用,引用便可,如寫腳本經常使用的位置參數。繼承
位置參數:特殊的只讀環境變量,一般在腳本 中引用,沒有賦值和修改操做,用於向shell腳本傳遞參數進程
系統變量:指系統預約義的一類環境變量,主要用於設定用戶shell環境,通常用戶也只知道何時引用便可。用戶能夠自行修改,但通常在腳本中修改這些變量也沒有什麼意義。可使用set查看。ip
用戶變量:用行任意定義的變量,能夠是環境變量,也能夠是局部變量內存
2. 變量的基本屬性和操做
變量的基本屬性和操做不區分是環境變量仍是局部變量,環境變量和局部變量只是有定義和做用範圍的差別而已
變量數據類型
shell變量是無類型,嚴格來講數據類型只有字符型,因此shell不要求定義變量時聲明其類型,定義取用比較隨意。至於數值運算,shell會根據上下文將文本當作數值型,並進行算術和比較等數值操做(若變量中包含數字,則認定其爲數值型變量.)
變量名稱
由 _,A-Z,a-z,0-9字符組成,不能以數字開頭,默認約定環境變量所有大寫,局部變量小寫。用記可自行定義命名規則,但最好不要引發沒必要要的混淆。
變量賦值
變量能夠設置爲任何值,當設置的值包含空格時,需將值使使用引號括起來。
variable=value(兩邊無空格,若value包含空格,習慣使用"" 或' ')
${variable=value}
賦值的特殊模式:
variable+value,對已賦值的variable,重設其值,未賦值則仍爲空
variable:?value ,對未賦值的variable ,顯示系統錯誤信息,不然顯示variable的值(用於測試變量是否已賦值)
variable:=value 對未賦值的variable ,將value值賦給它
variable:-value ,賦值,但不存儲在對地址空間
e.g.
variable2="hello world" 定義變量且賦值,或重設其值
variable4="we are saying $variable2" 變量賦值
variable=value;echo $variable 輸出value
echo ${variable=value} , 若variable 未定義,則賦值,表達式值爲value. 若variable已定義,則varible 保持原值,且表達式值與其相同
echo ${variable+value} ,variable 已賦值,則variable和表達式的值均爲value.若variable未賦值,表達式爲空,且不會定義variable
echo ${variable:?value} variable 未賦值,顯示系統錯誤;variable已賦值,表達式值爲$variable (用於測試變量是否被賦值)
echo ${variable:=value},variable未賦值,將value值賦給它,表達式值爲value;varialbe 已賦值,保持原值,表達式的值爲$variable
echo ${variable:-value},variable值保持不變,variable已賦值時,表達式值爲$varialbe. variable未賦值時,表達式值爲value
PATH="$PATH":/home/bin"$變量名稱" ${變量} 擴增變量內容
變量引用
即提取變量值時使用,引用變量也稱爲變量替換(使用符號$), $variable即表示變量值。
${variable},可避免變量名引用時的歧義,好比變量名包含空格或者變量名後有其它字符時的引用
e.g.
echo $LOGNAME
取消變量:unset variable釋放變量的內存空間
清空變量: variable= 只是清空變量值,值爲null,
只讀變量
readonly variable=value
readonly variable 設置爲只讀變量,一旦設置爲只讀變量後,任何用戶沒法再對其賦值。能夠定義時賦值,並設定只讀屬性。也能夠修改爲只讀屬性。
declare , typeset也能夠定義只讀變量
變量操做總結
echo $變量名 引用變量值
echo ${變量名}
echo $var_1$var_2 結合變量值
unset VAR 取消變量
unset -v
unset -f
VAR= 清空變量
env export 列出環境變量
export -p
declare -x
set 列出全部變量
VAR=apple 變量創建與賦值語法
declare 聲明變量
readonly varname 定義只讀變量
read -p -t variable 讀取變量
3. 環境變量
每一個進程有一個由子進程繼承的環境變量集合,給系統或用戶應用程序設置的一些變量,一般用大寫表示。set 列出shell 變量,env 列出環境變量
通常的執行script 前,系統環境已經處在login shell中, 執行script 時建立子shell 時會繼承父shell(login shell) 的環境變量,環境變量適用於全部登陸進程產生的子進程。
4. 位置參數
位置參數是一種特殊的只讀變量,用於從命令行向shell腳本傳遞參數,能夠在腳本中用shift進行左移操做以處理參數。
$0 表示腳本名(程序名,第一個參數前的內容)
$1,$2,.....$9,${10},${11},....${100}表示第1,2....9,10,11,......100個參數
其它特殊變量
用來獲取腳本相關信,只要知道如何引用(前加$便可)和在哪引用。
Linux中執行的命令一般都有參數檢查機制,即參數非法,將打印用法消息,而且返回一個非零返回碼,以標識是何種錯誤。
命令結束狀態, 內置變量? ($?) 存儲命令執行後的返回值,0 爲成功 , 大於0的數值則表明各類失敗的代碼 , 常常做業用於條件測試
變量名 說明
* 以一個單字符串顯示全部向腳本傳遞的參數
@ 傳遞到腳本的全部參數
# 腳本參數個數
$ 當前運行腳本進程的PID,
? 上條指令的退出狀態:0 爲成功, (返回值) exitstatus,其它值表示各類錯誤
- 調用中向shell給出的選項
_ 前面指令的最後一個參數
! 最後一個後臺進程的PID
0 shell名稱
1~n 位置參數