(轉載)
shell中的變數類型有:本地變數、環境變數、位置變數、標準變數、特殊變數。
2.1.本地變數在shell指令碼的生存周期中使用的變數(也就是登入一個shell到退出,這個shell為生存周期)設定一個本地變數格式為:變數 名=變數,顯示一個變數:echo ${變數名}也可以不要大括弧,顯示本地所有變數:set就可以,本地變數還可以設定為唯讀:readonly 變數名,這時的變數就具有唯讀屬性,如果在shell下運行命令readonly,就會顯示當前環境下所有的唯讀變數。
2.2.環境變數用於所有的使用者進程(也就shell下所有的子進程),這個就有點像windows中的環境變數了(系統–>進階–>環境變 量),環境變數一般儲存在$HOME/.bash_profile和/etc/profile中,前者是只適用於目前使用者,後者適用於所有使用者佈建一個環 境變數用export,比喻我們這裡設定一個環境變數:export pagename=”ghostwwl”這樣就設定了一個叫做pagename的環境變數,我們可以通過env這個命令來查看,還有就是可以直接通過運行 export來查看。
2.3.位置變數也就相當於程式中的參數(也就相當於C中的argv),在shell中位置變數一般允許$0-$9一共10個,超過10個的,嘿嘿就必須使用其他方式了。很顯然這裡$0就是指令碼的名字了,從$1開始就是後面的參數了。說白了也就是那個argv了。
我們這裡舉個小例子,比喻有shell程式aa.sh於下:
#!/bin/bash
#named aa
echo “程式名為: $0″
echo “姓名為: $1″
echo “年齡為: $2″
echo “所屬省分為: $3″
echo “所在城市為: $4″
echo “第五個參數為: $5″
我們運行這個指令碼 ./aa.sh ghostwwl 24 Hubei Wuhan 顯示結果為:
程式名為: ./aa.sh
姓名為: ghostwwl
年齡為: 24
所屬省分為: Hubei
所在城市為: Wuhan
第五個參數為:
可以看出因為第五個參數沒有所以就為空白了
當然我們可以在指令碼中系統命令傳遞參數,比喻下面一句:
find /usr/share/realpaly -name $1 -print
這個指令碼語句就可以在指令碼中對檔案目錄/usr/share/realplay中檔案名稱為第一個參數的檔案進行尋找。
說這麼多他*的就是參數,搞半天。
2.4.標準變數,也就是bash環境建立的一些標準環境的標量,他會自動去解析,基本都在/etc/profile中定義了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
EXINIT 是vi編輯器初始化啟動並執行一些參數
HOME 這個傻子都知道,就是偶們的主目錄
IFS 一個個欄位域之間用什麼隔開的理論上可以任一字元,比喻/usr/bin;/usr/sbin
這裡的IFS就是”;”了。
LOGNAME 看名字就知道 是登入名稱可以用 echo $LOGNAME 來查看
MAIL 表示當使用者的郵箱路徑
MAILCHECK 表示每間隔多少秒檢查一次收件匣
還有一堆標準變數PATH,tz,PS1,PS2,PWD等等,我這裡就不全部寫了,自己去找資料看,相信應該蠻好找的。
2.5.特殊變數
$# 表示傳遞到指令碼的參數列表
$* 以一個字串顯示所有向指令碼傳遞的參數,跟位置變數不同的是這裡參數可超過9個。
$$ 表示當前運行指令碼的進程ID號
$! 表示後台啟動並執行一個進程的ID號
$@ 與$#相同,但是使用時加引號,並在引號中返回每一個參數
$- 顯示shell使用的當前選項,與set命令相同
$? 顯示最後命令啟動並執行推出狀態,0表示沒有錯誤,其他任何值表示有錯誤
3.shell中的變數替換
這裡說一下變數替換這個經常用到,其實就是用變數的值替 換他的名字,顯示變數的時候就是這個,可以用:
為了實驗我們先定義一個變數haha=”**** you”
a.${變數名}來搞定(這裡的大括弧可要可不要,不過偶一般都加)
b.${變數名:+變數值}這個表示如果前面的變數值不為空白,則顯示變數值,否則置空,比喻echo ${name:+”ghostwwl”}這樣可不管你以前有沒有對name賦過值都會顯示這裡的”ghostwwl”
c.${變數名:?錯誤資訊}這個表示當變數名存在,就是變數的值,不存在就顯示問號後面的錯誤資訊比喻echo ${age:+”No defined variable age”}這個因為age不存在所以它會顯示錯誤資訊age:No defined variable age
d.${變數名:-變數值}這個表示如果如果變數名沒有設定,就用這裡給出變數值來代替,顯然如果設定了肯定就是返回原來設定的值:比喻echo ${age:-24}因為age變數沒有設定,所以它會用24去代替,如果是echo ${haha:-”hello”}這裡會顯示原來所賦的值”**** you”記得不要跟b中的情況搞混。
e.${變數名:=變數值}表示如果沒有設定變數名這個變數,就設定它的值,比喻echo ${age:=24}因為沒有設定age這個值,所以運行這句的時候會賦值並顯示。當然這樣賦值以後就可以把age當正常變數用了,也就是這時我們有 haha和age這兩個變數了。
就這五種了(當然如果把第一種去掉大括弧,就6種了),開始可能並不習慣,用多了就習慣了,啊哈哈!
4.清除變數(unset)
能定義變數當然也就能刪除變數了,比喻我們要刪除那個haha,因為值為”**** you”不太文明,我們可以用:unset haha 從這裡就可以看出清除變數用unset 變數名。
這裡我們要注意,設定了readonly的唯讀變數不能取消也不能重新設定值。
我們這裡再來把前面個例子改一下:
#!/bin/bash
#named aa
echo “程式名為: $0″
echo “姓名為: $1″
echo “年齡為: $2″
echo “所屬省分為: $3″
echo “所在城市為: $4″
echo “參數個數為: $#”
echo “指令碼參數為: $*”
echo “指令碼進程ID為: $$”
我們再來運行這個指令碼 ./aa.sh ghostwwl 24 hubei wuhan 結果為:
程式名為: ./aa.sh
姓名為: ghostwwl
年齡為: 24
所屬省分為: hubei
所在城市為: wuhan
指令碼參數個數為: 4
指令碼參數為: ghostwwl 24 hubei wuhan
指令碼進程ID為: 212
5.影響變數的一些命令
5.1 declare 建立或顯示變數
參數-f 只顯示函數名
參數-r 建立唯讀變數(typeset也可以)
參數-x 建立轉出變數
參數-i 建立整數變數
如果參數中使用+來代替-,表示選項的含義相反。
5.2 export 建立環境變數
參數– 表明選項結束,所有後面的參數都是實參
參數-f 表示在”變數-值”對照中的變數是一個函數名
參數-n 表示把全域變數轉換成局部變數(也就是本地變數)。
參數-p 顯示全域變數列表
5.3 readonly 建立或顯示唯讀變數
參數– 表示選項結束
參數-f 建立唯讀變數
5.4 set 設定或者重設各種shell
5.5 shift [n] 用來移動或調整位置變數,使$4賦給$3(也就是全都向前面移動一次),這個裡面的n表示移動幾位,預設是移動一位。
5.6 typeset 這個就跟declare相同了
5.7 unset 清除變數的定義
參數– 表示選項結束
參數-f 刪除唯讀變數,但是不能sehll環境中制定的變數和函數。
6.shell的運算子
6.1 位元運算 ~,>>,<<,&,|,^ 一看就知道分別是取反,左移,右移,與,或,異或。
6.2 $[]表示對[]中的運算式求值和$(())相等的。
6.3 邏輯運算子 &&,||,>,<,==,!= 是人都看得懂跟C裡一樣的。
6.4 賦值運算子 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他語言差不多一看就明白的。當然運算式賦值let $a=$b+$c這種形式。
6.5 運算子的優先順序我就不想廢話了,都跟其他語言差不多。