shell生活序
從編程語言的觀點(diǎn)看linux shell-變量的作用域,環(huán)境變量,位置變量
我們?nèi)砸訠ASH 為討論的shell 語言
每一種編程語言中,我們都會(huì)碰到變量的作用域的問題。(比如在函數(shù)中定義的變量在函數(shù)外不能使用的)
BASH 中也有類似的問題,局部變量和環(huán)境變量(全局變量)。
局部變量是普通的變量,僅在創(chuàng)建它的Shell中有效。
環(huán)境變量。我們更多的使用“環(huán)境變量”而不是“全局變量”,因?yàn)檫@個(gè)名稱更
能體現(xiàn)它的特點(diǎn)。環(huán)境變量對(duì)創(chuàng)建它的Shell及其派生出來的子進(jìn)程都有效。或者說環(huán)境變量可以繼承,但它對(duì)其它與創(chuàng)建它的Shell沒有關(guān)系的Shell并不可見。
聲明環(huán)境變量:declare -x 變量名=值
??????????????????????????? export 變量名=值
??????????????????????????? export 已經(jīng)定義的局部變量名
在談?wù)劻硪活惖闹匾兞?#xff0c;位置變量。函數(shù),腳本等都需要參數(shù),位置變量就是
用來獲得這些參數(shù)的。相當(dāng)于其它編程語言的形參。
$0? 表示當(dāng)前腳本文件名。
$1,$2,$3,........,$9,${10},.... 表示第1,2,3.......個(gè)參數(shù)。
$# 位置變量的個(gè)數(shù)
$* $@ 表示所有的位置變量。(當(dāng)然,兩者還是有區(qū)別的。)
shell中的變量和運(yùn)算符
1.什么是變量?
???
??? 這個(gè)就不用廢話了,shell中的變量跟其他高級(jí)語言中的變量概念是一樣的。
2.shell中變量的類型?
????
??? shell中的變量類型有:本地變量、環(huán)境變量、位置變量、標(biāo)準(zhǔn)變量、特殊變量。
??? 2.1.本地變量在shell腳本的生存周期中使用的變量(也就是登錄一個(gè)shell到退出,這個(gè)shell為生存周期)設(shè)置一個(gè)本地變量格式為:變量名=變量,顯示一個(gè)變量:echo ${變量名}也可以不要大括號(hào),顯示本地所有變量:set就可以,本地變量還可以設(shè)置為只讀的:readonly 變量名,這時(shí)的變量就具有只讀屬性,如果在shell下運(yùn)行命令readonly,就會(huì)顯示當(dāng)前環(huán)境下所有的只讀變量。
???
??? 2.2.環(huán)境變量用于所有的用戶進(jìn)程(也就shell下所有的子進(jìn)程),這個(gè)就有點(diǎn)像windows中的環(huán)境變量了(系統(tǒng)–>高級(jí)–>環(huán)境變量),環(huán)境變量一般保存在$HOME/.bash_profile和/etc/profile中,前者是只適用于當(dāng)前用戶,后者適用于所有用戶設(shè)置一個(gè)環(huán)境變量用export,比喻我們這里設(shè)置一個(gè)環(huán)境變量:export pagename=”ghostwwl”這樣就設(shè)置了一個(gè)叫做pagename的環(huán)境變量,我們可以通過env這個(gè)命令來查看,還有就是可以直接通過運(yùn)行export來查看。
??? 2.3.位置變量也就相當(dāng)于程序中的參數(shù)(也就相當(dāng)于C中的argv),在shell中位置變量一般允許$0-$9一共10個(gè),超過10個(gè)的,嘿嘿就必須使用其他方式了。很顯然這里$0就是腳本的名字了,從$1開始就是后面的參數(shù)了。說白了也就是那個(gè)argv了。
我們這里舉個(gè)小例子,比喻有shell程序aa.sh于下:
??? #!/bin/bash
??? #named aa
??? echo “程序名為: $0″
??? echo “姓名為: $1″
??? echo “年齡為: $2″
??? echo “所屬省分為: $3″
??? echo “所在城市為: $4″
??? echo “第五個(gè)參數(shù)為: $5″
我們運(yùn)行這個(gè)腳本 ./aa.sh ghostwwl 24 Hubei Wuhan 顯示結(jié)果為:
??? 程序名為: ./aa.sh
??? 姓名為: ghostwwl
??? 年齡為: 24
??? 所屬省分為: Hubei
??? 所在城市為: Wuhan
??? 第五個(gè)參數(shù)為:
可以看出因?yàn)榈谖鍌€(gè)參數(shù)沒有所以就為空了
當(dāng)然我們可以在腳本中系統(tǒng)命令傳遞參數(shù),比喻下面一句:
find /usr/share/realpaly -name $1 -print
這個(gè)腳本語句就可以在腳本中對(duì)文件目錄/usr/share/realplay中文件名為第一個(gè)參數(shù)的文件進(jìn)行查找。
說這么多他*的就是參數(shù),搞半天。
??
??? 2.4.標(biāo)準(zhǔn)變量,也就是bash環(huán)境建立的一些標(biāo)準(zhǔn)環(huán)境的標(biāo)量,他會(huì)自動(dòng)去解析,基本都在/etc/profile中定義了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
??? EXINIT 是vi編輯器初始化運(yùn)行的一些參數(shù)
??? HOME 這個(gè)傻子都知道,就是偶們的主目錄
??? IFS 一個(gè)個(gè)字段域之間用什么隔開的理論上可以任意字符,比喻/usr/bin;/usr/sbin
這里的IFS就是”;”了。
??? LOGNAME 看名字就知道 是登錄名可以用 echo $LOGNAME 來查看
??? MAIL 表示當(dāng)用戶的郵箱路徑
??? MAILCHECK 表示每間隔多少秒檢查一次收件箱
還有一堆標(biāo)準(zhǔn)變量PATH,tz,PS1,PS2,PWD等等,我這里就不全部寫了,自己去找資料看,相信應(yīng)該蠻好找的。
??? 2.5.特殊變量
$# 表示傳遞到腳本的參數(shù)列表
$* 以一個(gè)字符串顯示所有向腳本傳遞的參數(shù),跟位置變量不同的是這里參數(shù)可超過9個(gè)。
$$ 表示當(dāng)前運(yùn)行腳本的進(jìn)程ID號(hào)
$! 表示后臺(tái)運(yùn)行的一個(gè)進(jìn)程的ID號(hào)
$@ 與$#相同,但是使用時(shí)加引號(hào),并在引號(hào)中返回每一個(gè)參數(shù)
$- 顯示shell使用的當(dāng)前選項(xiàng),與set命令相同
$? 顯示最后命令運(yùn)行的推出狀態(tài),0表示沒有錯(cuò)誤,其他任何值表示有錯(cuò)誤?
3.shell中的變量替換
??? 這里說一下變量替換這個(gè)經(jīng)常用到,其實(shí)就是用變量的值替 換他的名字,顯示變量的時(shí)候就是這個(gè),可以用:
為了試驗(yàn)我們先定義一個(gè)變量haha=”**** you”
???? a.${變量名}來搞定(這里的大括號(hào)可要可不要,不過偶一般都加)
???? b.${變量名:+變量值}這個(gè)表示如果前面的變量值不為空,則顯示變量值,否則置空,比喻echo ${name:+”ghostwwl”}這樣可不管你以前有沒有對(duì)name賦過值都會(huì)顯示這里的”ghostwwl”
???? c.${變量名:?錯(cuò)誤信息}這個(gè)表示當(dāng)變量名存在,就是變量的值,不存在就顯示問號(hào)后面的錯(cuò)誤信息比喻echo ${age:+”No defined variable age”}這個(gè)因?yàn)閍ge不存在所以它會(huì)顯示錯(cuò)誤信息age:No defined variable age
???? d.${變量名:-變量值}這個(gè)表示如果如果變量名沒有設(shè)置,就用這里給出變量值來代替,顯然如果設(shè)置了肯定就是返回原來設(shè)置的值:比喻echo ${age:-24}因?yàn)閍ge變量沒有設(shè)置,所以它會(huì)用24去代替,如果是echo ${haha:-”hello”}這里會(huì)顯示原來所賦的值”**** you”記得不要跟b中的情況搞混。
???? e.${變量名:=變量值}表示如果沒有設(shè)置變量名這個(gè)變量,就設(shè)置它的值,比喻echo ${age:=24}因?yàn)闆]有設(shè)置age這個(gè)值,所以運(yùn)行這句的時(shí)候會(huì)賦值并顯示。當(dāng)然這樣賦值以后就可以把a(bǔ)ge當(dāng)正常變量用了,也就是這時(shí)我們有haha和age這兩個(gè)變量了。
??? 就這五種了(當(dāng)然如果把第一種去掉大括號(hào),就6種了),開始可能并不習(xí)慣,用多了就習(xí)慣了,啊哈哈!
4.清除變量(unset)
??? 能定義變量當(dāng)然也就能刪除變量了,比喻我們要?jiǎng)h除那個(gè)haha,因?yàn)橹禐椤?*** you”不太文明,我們可以用:unset haha 從這里就可以看出清除變量用unset 變量名。
??? 這里我們要注意,設(shè)置了readonly的只讀變量不能取消也不能重新設(shè)置值。
我們這里再來把前面?zhèn)€例子改一下:
??? #!/bin/bash
??? #named aa
??? echo “程序名為: $0″
??? echo “姓名為: $1″
??? echo “年齡為: $2″
??? echo “所屬省分為: $3″
??? echo “所在城市為: $4″
??? echo “參數(shù)個(gè)數(shù)為: $#”
??? echo “腳本參數(shù)為: $*”
??? echo “腳本進(jìn)程ID為: $$”
我們?cè)賮磉\(yùn)行這個(gè)腳本 ./aa.sh ghostwwl 24 hubei wuhan 結(jié)果為:
??? 程序名為: ./aa.sh
??? 姓名為: ghostwwl
??? 年齡為: 24
??? 所屬省分為: hubei
??? 所在城市為: wuhan
??? 腳本參數(shù)個(gè)數(shù)為: 4
??? 腳本參數(shù)為: ghostwwl 24 hubei wuhan
??? 腳本進(jìn)程ID為: 212
5.影響變量的一些命令
??? 5.1 declare 創(chuàng)建或顯示變量
??????? 參數(shù)-f 只顯示函數(shù)名
??????? 參數(shù)-r 創(chuàng)建只讀變量(typeset也可以)
??????? 參數(shù)-x 創(chuàng)建轉(zhuǎn)出變量
??????? 參數(shù)-i 創(chuàng)建整數(shù)變量
??????? 如果參數(shù)中使用+來代替-,表示選項(xiàng)的含義相反。
????
??? 5.2 export 創(chuàng)建環(huán)境變量
??????? 參數(shù)– 表明選項(xiàng)結(jié)束,所有后面的參數(shù)都是實(shí)參
??????? 參數(shù)-f 表示在”變量-值”對(duì)照中的變量是一個(gè)函數(shù)名
??????? 參數(shù)-n 表示把全局變量轉(zhuǎn)換成局部變量(也就是本地變量)。
??????? 參數(shù)-p 顯示全局變量列表
?
??? 5.3 readonly 創(chuàng)建或顯示只讀變量
??????? 參數(shù)– 表示選項(xiàng)結(jié)束
??????? 參數(shù)-f 創(chuàng)建只讀變量
??? 5.4 set 設(shè)置或者重設(shè)各種shell
??? 5.5 shift [n] 用來移動(dòng)或調(diào)整位置變量,使$4賦給$3(也就是全都向前面移動(dòng)一次),這個(gè)里面的n表示移動(dòng)幾位,默認(rèn)是移動(dòng)一位。
??? 5.6 typeset 這個(gè)就跟declare相同了
??? 5.7 unset 清除變量的定義
??????? 參數(shù)– 表示選項(xiàng)結(jié)束
??????? 參數(shù)-f 刪除只讀變量,但是不能sehll環(huán)境中制定的變量和函數(shù)。
6.shell的運(yùn)算符
?? 6.1 位運(yùn)算 ~,>>,<<,&,|,^ 一看就知道分別是取反,左移,右移,與,或,異或。
?? 6.2 $[]表示對(duì)[]中的表達(dá)式求值和$(())相等的。
?? 6.3 邏輯運(yùn)算符 &&,||,>,<,==,!= 是人都看得懂跟C里一樣的。?
?? 6.4 賦值運(yùn)算符 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他語言差不多一看就明白的。當(dāng)然表達(dá)式賦值let $a=$b+$c這種形式。
?? 6.5 運(yùn)算符的優(yōu)先級(jí)我就不想廢話了,都跟其他語言差不多的,自己去找。
http://why-gudu.spaces.live.com/Blog/cns!1pziotErZQfm5-4NtdB7DJ3w!155.entry
http://bbs.topsage.com/dv_rss_xm_119_195915_1.html
?
總結(jié)
- 上一篇: Flume安装部署
- 下一篇: SSL双向认证和SSL单向认证的区别