現(xiàn)在我們使用的操作系統(tǒng)(Windows、Mac OS、Android、iOS 等)都是帶圖形界面的,簡(jiǎn)單直觀,容易上手,對(duì)專業(yè)用戶(程序員、網(wǎng)管等)和普通用戶(家庭主婦、老年人等)都非常適用;計(jì)算機(jī)的普及離不開(kāi)圖形界面。
然而在計(jì)算機(jī)的早期并沒(méi)有圖形界面,我們只能通過(guò)一個(gè)一個(gè)地命令來(lái)控制計(jì)算機(jī),這些命令有成百上千之多,且不說(shuō)記住這些命令非常困難,每天面對(duì)沒(méi)有任何色彩的“黑屏”本身就是一件枯燥的事情;這個(gè)時(shí)候的計(jì)算機(jī)還遠(yuǎn)遠(yuǎn)談不上炫酷和普及,只有專業(yè)人員才能使用。
猛擊《帶你逛西雅圖活電腦博物館》可以欣賞更多早期的計(jì)算機(jī)。
對(duì)于圖形界面,用戶點(diǎn)擊某個(gè)圖標(biāo)就能啟動(dòng)某個(gè)程序;對(duì)于命令行,用戶輸入某個(gè)程序的名字(可以看做一個(gè)命令)就能啟動(dòng)某個(gè)程序。這兩者的基本過(guò)程都是類似的,都需要查找程序在硬盤上的安裝位置,然后將它們加載到內(nèi)存運(yùn)行。
關(guān)于程序的運(yùn)行原理,請(qǐng)猛擊《載入內(nèi)存,讓程序運(yùn)行起來(lái)》。
換句話說(shuō),圖形界面和命令行要達(dá)到的目的是一樣的,都是讓用戶控制計(jì)算機(jī)。
然而,真正能夠控制計(jì)算機(jī)硬件(CPU、內(nèi)存、顯示器等)的只有操作系統(tǒng)內(nèi)核(Kernel),圖形界面和命令行只是架設(shè)在用戶和內(nèi)核之間的一座橋梁。
由于安全、復(fù)雜、繁瑣等原因,用戶不能直接接觸內(nèi)核(也沒(méi)有必要),需要另外再開(kāi)發(fā)一個(gè)程序,讓用戶直接使用這個(gè)程序;該程序的作用就是接收用戶的操作(點(diǎn)擊圖標(biāo)、輸入命令),并進(jìn)行簡(jiǎn)單的處理,然后再傳遞給內(nèi)核。如此一來(lái),用戶和內(nèi)核之間就多了一層“代理”,這層“代理”既簡(jiǎn)化了用戶的操作,也保護(hù)了內(nèi)核。
用戶界面和命令行就是這個(gè)另外開(kāi)發(fā)的程序,就是這層“代理”。在Linux下,這個(gè)命令行程序叫做 Shell。
Shell 除了能解釋用戶輸入的命令,將它傳遞給內(nèi)核,還可以:
由此可見(jiàn),Shell 是將內(nèi)核、程序和用戶連接了起來(lái)。
Shell 本身支持的命令并不多,但是它可以調(diào)用其他的程序,每個(gè)程序就是一個(gè)命令,這使得 Shell 命令的數(shù)量可以無(wú)限擴(kuò)展,其結(jié)果就是 Shell 的功能非常強(qiáng)大,完全能夠勝任 Linux 的日常管理工作,如文本或字符串檢索、文件的查找或創(chuàng)建、大規(guī)模軟件的自動(dòng)部署、更改系統(tǒng)設(shè)置、監(jiān)控服務(wù)器性能、發(fā)送報(bào)警郵件、抓取網(wǎng)頁(yè)內(nèi)容、壓縮文件等。
Shell 并不是簡(jiǎn)單的堆砌命令,我們還可以在 Shell 中編程,這和使用 C/C++、Java、Python 等常見(jiàn)的編程語(yǔ)言并沒(méi)有什么兩樣。
Shell 雖然沒(méi)有 C/C++、Java、Python 等強(qiáng)大,但也支持了基本的編程元素,例如:
站在這個(gè)角度講,Shell 也是一種編程語(yǔ)言,它的編譯器(解釋器)是 Shell 這個(gè)程序。我們平時(shí)所說(shuō)的 Shell,有時(shí)候是指連接用戶和內(nèi)核的這個(gè)程序,有時(shí)候又是指 Shell 編程。
Shell 主要用來(lái)開(kāi)發(fā)一些實(shí)用的、自動(dòng)化的小工具,而不是用來(lái)開(kāi)發(fā)具有復(fù)雜業(yè)務(wù)邏輯的中大型軟件,例如檢測(cè)計(jì)算機(jī)的硬件參數(shù)、一鍵搭建Web開(kāi)發(fā)環(huán)境、日志分析等,Shell 都非常合適。
使用 Shell 的熟練程度反映了用戶對(duì) Linux 的掌握程度,運(yùn)維工程師、網(wǎng)絡(luò)管理員、程序員都應(yīng)該學(xué)習(xí) Shell。
尤其是 Linux 運(yùn)維工程師,Shell 更是必不可少的,是必須掌握的技能,它使得我們能夠自動(dòng)化地管理服務(wù)器集群,否則你就得一個(gè)一個(gè)地登錄所有的服務(wù)器,對(duì)每一臺(tái)服務(wù)器都進(jìn)行相同的設(shè)置,而這些服務(wù)器可能有成百上千之多,會(huì)浪費(fèi)大量的時(shí)間在重復(fù)性的工作上。
任何代碼最終都要被“翻譯”成二進(jìn)制的形式才能在計(jì)算機(jī)中執(zhí)行。
有的編程語(yǔ)言,如 C/C++、Pascal、Go語(yǔ)言、匯編等,必須在程序運(yùn)行之前將所有代碼都翻譯成二進(jìn)制形式,也就是生成可執(zhí)行文件,用戶拿到的是最終生成的可執(zhí)行文件,看不到源碼。
這個(gè)過(guò)程叫做編譯(Compile),這樣的編程語(yǔ)言叫做編譯型語(yǔ)言,完成編譯過(guò)程的軟件叫做編譯器(Compiler)。
而有的編程語(yǔ)言,如 Shell、JavaScript、Python、PHP等,需要一邊執(zhí)行一邊翻譯,不會(huì)生成任何可執(zhí)行文件,用戶必須拿到源碼才能運(yùn)行程序。程序運(yùn)行后會(huì)即時(shí)翻譯,翻譯完一部分執(zhí)行一部分,不用等到所有代碼都翻譯完。
這個(gè)過(guò)程叫做解釋,這樣的編程語(yǔ)言叫做解釋型語(yǔ)言或者腳本語(yǔ)言(Script),完成解釋過(guò)程的軟件叫做解釋器。
編譯型語(yǔ)言的優(yōu)點(diǎn)是執(zhí)行速度快、對(duì)硬件要求低、保密性好,適合開(kāi)發(fā)操作系統(tǒng)、大型應(yīng)用程序、數(shù)據(jù)庫(kù)等。
腳本語(yǔ)言的優(yōu)點(diǎn)是使用靈活、部署容易、跨平臺(tái)性好,非常適合Web開(kāi)發(fā)以及小工具的制作。
Shell 就是一種腳本語(yǔ)言,我們編寫完源碼后不用編譯,直接運(yùn)行源碼即可。
(這些往往是經(jīng)常用到,但是各種網(wǎng)絡(luò)上的材料都語(yǔ)焉不詳?shù)臇|西,個(gè)人認(rèn)為比較有用)
d??????????? 目錄?????????????????????????????????????????????????????? l???????????? 符號(hào)鏈接
s???????????? 套接字文件?????????????????????????????????????????? b??????????? 塊設(shè)備文件
c??????????? 字符設(shè)備文件?????????????????????????????????????? p??????????? 命名管道文件
-???????????? 普通文件
從一個(gè)文件或命令輸出中抽取或過(guò)濾文本時(shí)??墒褂谜齽t表達(dá)式(RE),正則表達(dá)式是一些特殊或不很特殊的字符串模式的集合。
基本的元字符集:
^?????????????????? 只匹配行首。
$?????????????????? 只匹配行尾。
*?????????????????? 一個(gè)單字符后緊跟*,匹配0個(gè)或多個(gè)此單字符。
[]?????????????????? 匹配[]內(nèi)字符,可以是一個(gè)單字符,也可以是字符序列。可以使
用-來(lái)表示[]內(nèi)范圍,如[1-5]等價(jià)于[1,2,3,4,5]。
\??????????????????? 屏蔽一個(gè)元字符的特殊含義,如\$表示字符$,而不表示匹配行
尾。
.?? ????????????? 匹配任意單字符。
pattern\{n\}?? 匹配pattern出現(xiàn)的次數(shù)n
pattern\{n,\}m匹配pattern出現(xiàn)的次數(shù),但表示次數(shù)最少為n
pattern\{n,m\} 匹配pattern出現(xiàn)的次數(shù)在n與m之間(n,m為0-255)
幾個(gè)常見(jiàn)的例子:
顯示可執(zhí)行的文件:ls –l | grep …x...x..x
只顯示文件夾:ls –l | grep? ^d
匹配所有的空行:^$
匹配所有的單詞:[A-Z a-z]*
匹配任一非字母型字符:[^A-Z a-z]
包含八個(gè)字符的行:^……..$(8個(gè).)
以下是可用字符類的相當(dāng)完整的列表:
[:alnum:] 字母數(shù)字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表鍵
[:cntrl:] 任何控制字符
[:digit:] 數(shù)字 [0-9]
[:graph:] 任何可視字符(無(wú)空格)
[:lower:] 小寫 [a-z]
[:print:] 非控制字符
[:punct:] 標(biāo)點(diǎn)字符
[:space:] 空格
[:upper:] 大寫 [A-Z]
[:xdigit:] 十六進(jìn)制數(shù)字 [0-9 a-f A-F]
盡可能使用字符類是很有利的,因?yàn)樗鼈兛梢愿玫剡m應(yīng)非英語(yǔ) locale(包括某些必需的重音字符等等).
shell共有四種引用類型:
“ ”????????? 雙引號(hào)
‘ ’?????????? 單引號(hào)
` ` ??????? 反引號(hào)
\??????????? 反斜線
l??????? “ ” 可引用除$、` 、\ 、外的任意字符或字符串,“ ”中的變量能夠正常顯示變量值。
l??????? ‘ ’與“ ”類似,不同在于shell會(huì)忽略任何的引用值。
例如: GIRL=‘girl’
echo “The ‘$GIRL’ did well”
則打?。篢he ‘girl’ did well
l??????? ` `用于設(shè)置系統(tǒng)命令的輸出到變量,shell會(huì)將` `中的內(nèi)容作為一個(gè)系統(tǒng)命令并執(zhí)行質(zhì)。
例如:echo `date` 則打印當(dāng)前的系統(tǒng)時(shí)間。
l??????? \ 用來(lái)屏蔽特殊含義的字符:&? *? +? ^? $? `? “? |? ?
例如:expr 12 \* 12 將輸出144
valiable_name=value?????????? 設(shè)置實(shí)際值到 variable_name中
valiable_name+value?????????? 如果設(shè)置了variable_name,則重設(shè)其值
valiable_name:?value?????????? 如果未設(shè)置variable_name,則先顯示未定義用戶錯(cuò)誤信息
valiable_name?value?????????? 如果未設(shè)置variable_name,則顯示系統(tǒng)錯(cuò)誤信息
valiable_name:=value?? 如果未設(shè)置variable_name,則設(shè)置其值
valiable_name-value??????????? 同上,但取值并不設(shè)置到variable_name
test命令用于測(cè)試字符串、文件狀態(tài)和數(shù)字,expr測(cè)試和執(zhí)行數(shù)值輸出。
Test格式:test condition 或 [ condition ](需要特別注意的是condition的兩邊都要有一個(gè)空格,否則會(huì)報(bào)錯(cuò)),test命令返回0表示成功。
l??????? 下面將分別描述test的三種測(cè)試:
n??????? 文件狀態(tài)測(cè)試(常用的)
-d?????????? 測(cè)試是否文件夾
-f??????????? 測(cè)試是否一般文件
-L????????? 測(cè)試是否鏈接文件
-r?????????? 測(cè)試文件是否可讀
-w ??????? 測(cè)試文件是否可寫
-x?????????? 測(cè)試文件是否可執(zhí)行
-s?????????? 測(cè)試文件是否非空
n??????? 字符串測(cè)試
五種格式: test? “string”
test? string_operator? “string”
test? “string”? string_operator? “string”
[ string_operator? “string” ]
[ “string”? string_operator? “string” ]
其中string_operator可以為:?????? =???? 兩字符串相等
!=??? 兩字符串不等
-z ? 空串
-n ? 非空串
n??????? 數(shù)值測(cè)試
兩種格式: “number”? number_operator? “number”
[ “number”? number_operator? “number” ]
其中:number_operator 可以為:-eq? 、-ne、-gt、-lt、-ge
例如:? NUMBER=130
[ “990”? –le? “995”? –a? “NUMBER”? -gt? “133” ]
(其中-a表示前后結(jié)果相“與”)
l??????? expr命令一般用于整數(shù)值,但也可以用于字符串。
n??????? 格式:? expr srgument operator operator argument
例如:? expr 10 + 10
expr 10 ^ 2 (10的平方)
expr $value + 10
n??????? 增量計(jì)數(shù)――expr在循環(huán)中最基本的用法
例如:? LOOP=0
LOOP=`expr $LOOP + 1`
n??????? 模式匹配:通過(guò)指定的冒號(hào)選項(xiàng)計(jì)算字符串中的字符數(shù)
例如:? value=account.doc
expr $value : `\(.*\).doc`
輸出 account
每一個(gè)在UNIX/Linux上工作的程序員可能都擅長(zhǎng)shell腳本編程。但大家解決問(wèn)題的方式卻不盡相同,這要取決于對(duì)專業(yè)知識(shí)的掌握程度、使用命令的種類、看待問(wèn)題的方式等等。對(duì)于那些處在shell腳本編程初級(jí)階段的程序員來(lái)說(shuō),遵循一些恰當(dāng)?shù)淖龇梢詭椭愀?、更好的學(xué)習(xí)這些編程技巧。下面,我們就來(lái)討論這些能幫助你學(xué)習(xí)shell腳本編程的方法吧。
0、多動(dòng)手
你想學(xué)習(xí)shell腳本編程,這很不錯(cuò)。于是你拿了一本書開(kāi)始學(xué)習(xí)。一些人會(huì)首先通讀整本教材后再上機(jī)練習(xí)。這種方法可能適用于一些人,但我卻不太看好它。我的建議是,僅僅學(xué)一些最基礎(chǔ)的能夠讓你開(kāi)始編碼的知識(shí)就可以了。之后,動(dòng)手寫一些簡(jiǎn)單的程序吧。一旦你由于知識(shí)上的欠缺而不得不停止時(shí),再回到書本上去讀你想要了解的那部分,然后繼續(xù)做你的項(xiàng)目。如此周而復(fù)始,不斷提高你的水平。這種邊學(xué)邊做的方法曾讓我受益良多。
1、善用命令提示符
有時(shí)候,我們寫的腳本中有一些錯(cuò)誤。我們修改錯(cuò)誤,運(yùn)行腳本,但系統(tǒng)再次報(bào)錯(cuò)。并且這個(gè)改錯(cuò)報(bào)錯(cuò)的過(guò)程可能會(huì)發(fā)生很多次。碰到這些情況,首先需要找到有問(wèn)題的行或命令,這可以通過(guò)一些調(diào)試語(yǔ)句來(lái)輕松做到。一旦發(fā)現(xiàn)這條語(yǔ)句,嘗試在命令提示符下執(zhí)行相同的語(yǔ)句。如果它在命令提示符下開(kāi)始正常運(yùn)行,你就可以容易的推斷出它不能正常運(yùn)行的原因了。可能是由于某些錯(cuò)誤輸入的命令,或者是某些環(huán)境變量不匹配,或者是從不同的地方引用了某個(gè)二進(jìn)制文件等等。這種方法會(huì)讓調(diào)試變得簡(jiǎn)單易行。
2、考慮問(wèn)題要全面
現(xiàn)在我們來(lái)看個(gè)問(wèn)題。你想到了關(guān)于某個(gè)問(wèn)題的解決方案,但這個(gè)解決方案只適用于處理小型文件??墒钱?dāng)處理比較大的文件時(shí),你該怎么辦?舉個(gè)例子,我們想要得到一個(gè)文件的第一行內(nèi)容:
1
|
sed -n '1p' file
|
這條語(yǔ)句當(dāng)然會(huì)給出你想要的第一行內(nèi)容??墒侨绻幚淼奈募习偃f(wàn)條記錄呢?盡管上面的那條sed命令可以輸出文件的第一行內(nèi)容,但是想要處理大型文件一定會(huì)帶來(lái)性能上的問(wèn)題。
解決辦法:
1
|
sed -n '1p;1q' file
|
這條命令將只輸出第一行,同時(shí)退出程序。
3、經(jīng)常嘗試不同的方法
你在寫腳本時(shí)碰到一個(gè)問(wèn)題,然后你找到了一種獨(dú)特的解決方法。下一次你偶然又碰到類似的問(wèn)題,這時(shí),不要再用以前你用過(guò)的方法來(lái)解決。試試另外一種方法吧。如果某一天再次遇到這種情況,再試試其它方法。
例如:
1
2
3
4
|
if [ $? -eq 0 ]
then
?? echo "Success"
fi
|
另一種方法:
1
|
[ $? -eq 0 ] && echo "Success"
|
現(xiàn)在你可能會(huì)明白這個(gè)博客里會(huì)有那么多以“……的不同解決方法”為題的文章了吧。所有這些文章的目的都是用來(lái)幫助訂閱這個(gè)博客的開(kāi)發(fā)者開(kāi)闊視野,打開(kāi)思路。
4、快速編碼
腳本可以節(jié)省我們的時(shí)間,提高生產(chǎn)力。可是,難道我們花在寫腳本和測(cè)試上的時(shí)間還少嗎?我們想寫一個(gè)腳本,于是打開(kāi)一個(gè)文件,寫下代碼,保存文件,之后運(yùn)行腳本,系統(tǒng)報(bào)錯(cuò),我們?cè)俅蜷_(kāi)文件修改、保存、運(yùn)行……在這個(gè)過(guò)程中會(huì)花費(fèi)很多時(shí)間。在此前的一篇題為《如何快速寫shell腳本》的文章里,你可以學(xué)會(huì)如何編寫腳本和測(cè)試正在運(yùn)行中的腳本,而不用再回顧命令提示符。這些方法可以加快編碼的速度。當(dāng)我寫腳本的時(shí)候,我總是使用這些方法。而且我可以很肯定的說(shuō),它們幫我節(jié)約了不少時(shí)間。
5、經(jīng)常使用內(nèi)部命令
無(wú)論碰到哪種情況,請(qǐng)盡量考慮使用內(nèi)部命令而不是外部命令。在此前的一篇題為《內(nèi)部命令和外部命令》的文章里,我們可以看到二者間的差異。用內(nèi)部命令對(duì)你永遠(yuǎn)都有好處。根據(jù)正在處理的輸入文件的大小,內(nèi)部命令可以在性能方面為你節(jié)省很多。雖然你并不總是有這樣選擇內(nèi)部命令抑或外部命令的機(jī)會(huì),但在某些情況下,你一定能做出正確的選擇。
6、沒(méi)有必要使用cat命令
這是我們經(jīng)常在論壇里討論的話題之一。沒(méi)有必要使用cat命令指的是在有些時(shí)候,我們會(huì)發(fā)現(xiàn)根本沒(méi)有必要使用cat命令。有時(shí)候,使用了多余的cat命令會(huì)讓你的代碼看起來(lái)很丑陋,而且還會(huì)帶來(lái)性能上的問(wèn)題。
例如:
1
|
$ cat /etc/passwd | grep guru
|
正確的方法應(yīng)該是:
1
|
$ grep guru /etc/passwd
|
7、仔細(xì)閱讀錯(cuò)誤信息
程序員常犯的一個(gè)錯(cuò)誤是:當(dāng)我們敲入的命令報(bào)錯(cuò)后,我們中的大多數(shù)人只是對(duì)錯(cuò)誤信息一瞥而過(guò),而不會(huì)去認(rèn)真的讀一讀。很多時(shí)候,錯(cuò)誤信息里就包含了解決辦法。更重要的是,有時(shí)候我們修改了某個(gè)錯(cuò)誤并再次運(yùn)行后,系統(tǒng)依舊會(huì)報(bào)錯(cuò)。然后我們?cè)俅涡薷模到y(tǒng)再次報(bào)錯(cuò)。這可能會(huì)持續(xù)很長(zhǎng)時(shí)間。但實(shí)際上,舊的錯(cuò)誤可能已經(jīng)被糾正,只是由于出現(xiàn)了其它一些新錯(cuò)誤才導(dǎo)致系統(tǒng)再次報(bào)錯(cuò)。而我們依舊在懷疑為什么修改好的代碼依然不能正常運(yùn)行。因此,請(qǐng)你養(yǎng)成仔細(xì)閱讀錯(cuò)誤信息的習(xí)慣。
8、盡量避免臃腫的命令
你正在嘗試去從一個(gè)大的文件中篩選某條信息。接下來(lái)你可能寫一大堆命令來(lái)實(shí)現(xiàn)這一功能??墒牵M管你將得到正確的結(jié)果,你寫的命令卻不夠好,且晦澀難懂。因此,我們應(yīng)該盡量避免這種情況發(fā)生。下面這個(gè)例子就是代碼優(yōu)化的好例子。
從程序員的角度來(lái)看, Shell本身是一種用C語(yǔ)言編寫的程序,從用戶的角度來(lái)看,Shell是用戶與Linux操作系統(tǒng)溝通的橋梁。用戶既可以輸入命令執(zhí)行,又可以利用 Shell腳本編程,完成更加復(fù)雜的操作。在Linux GUI日益完善的今天,在系統(tǒng)管理等領(lǐng)域,Shell編程仍然起著不可忽視的作用。深入地了解和熟練地掌握Shell編程,是每一個(gè)Linux用戶的必修 功課之一。
Linux的Shell種類眾多,常見(jiàn)的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。不同的Shell語(yǔ)言的語(yǔ)法有所不同,所以不能交換使用。每種Shell都有其特色之處,基本上,掌握其中任何一種 就足夠了。在本文中,我們關(guān)注的重點(diǎn)是Bash,也就是Bourne Again Shell,由于易用和免費(fèi),Bash在日常工作中被廣泛使用;同時(shí),Bash也是大多數(shù)Linux系統(tǒng)默認(rèn)的Shell。在一般情況下,人們并不區(qū)分 Bourne Shell和Bourne Again Shell,所以,在下面的文字中,我們可以看到#!/bin/sh,它同樣也可以改為#!/bin/bash。
利用vi等文本編輯器編寫Shell腳本的格式是固定的,如下:
1
2
3
|
#!/bin/sh #comments Your commands go here |
首行中的符號(hào)#!告訴系統(tǒng)其后路徑所指定的程序即是解釋此腳本文件的Shell程 序。如果首行沒(méi)有這句話,在執(zhí)行腳本文件的時(shí)候,將會(huì)出現(xiàn)錯(cuò)誤。后續(xù)的部分就是主程序,Shell腳本像高級(jí)語(yǔ)言一樣,也有變量賦值,也有控制語(yǔ)句。除第 一行外,以#開(kāi)頭的行就是注釋行,直到此行的結(jié)束。如果一行未完成,可以在行尾加上",這個(gè)符號(hào)表明下一行與此行會(huì)合并為同一行。
編輯完畢,將腳本存盤為filename.sh,文件名后綴sh表明這是一個(gè)Bash腳本文件。執(zhí)行腳本的時(shí)候,要先將腳本文件的屬性改為可執(zhí)行的:
1
|
chmod +x filename.sh |
執(zhí)行腳本的方法是:
1
|
. /filename .sh |
下面我們從經(jīng)典的“hello world”入手,看一看最簡(jiǎn)單的Shell腳本的模樣。
1
2
3
4
|
#!/bin/sh #print hello world in the console window a = "hello world" echo $a |
Shell Script是一種弱類型語(yǔ)言,使用變量的時(shí)候無(wú)需首先聲明其類型。新的變量會(huì)在本地?cái)?shù)據(jù)區(qū)分配內(nèi)存進(jìn)行存儲(chǔ),這個(gè)變量歸當(dāng)前的Shell所有,任何子進(jìn) 程都不能訪問(wèn)本地變量。這些變量與環(huán)境變量不同,環(huán)境變量被存儲(chǔ)在另一內(nèi)存區(qū),叫做用戶環(huán)境區(qū),這塊內(nèi)存中的變量可以被子進(jìn)程訪問(wèn)。變量賦值的方式是:
1
|
variable_name = variable_value |
如果對(duì)一個(gè)已經(jīng)有值的變量賦值,新值將取代舊值。取值的時(shí)候要在變量名前加$,$variable_name可以在引號(hào)中使用,這一點(diǎn)和其他高級(jí)語(yǔ)言是明顯不同的。如果出現(xiàn)混淆的情況,可以使用花括號(hào)來(lái)區(qū)分,例如:
echo "Hi, $as"
就不會(huì)輸出“Hi, hello worlds”,而是輸出“Hi,”。這是因?yàn)镾hell把$as當(dāng)成一個(gè)變量,而$as未被賦值,其值為空。正確的方法是:
echo "Hi, ${a}s"
單引號(hào)中的變量不會(huì)進(jìn)行變量替換操作。
關(guān)于變量,還需要知道幾個(gè)與其相關(guān)的Linux命令。
env用于顯示用戶環(huán)境區(qū)中的變量及其取值;set用于顯示本地?cái)?shù)據(jù)區(qū)和用戶環(huán)境區(qū)中的變量及其取值;unset用于刪除指定變量當(dāng)前的取值,該值將被指定為NULL;export命令用于將本地?cái)?shù)據(jù)區(qū)中的變量轉(zhuǎn)移到用戶環(huán)境區(qū)。
]]>