但是,使用分號(hào)來(lái)順序執(zhí)行命令有一個(gè)缺點(diǎn),那就是一旦其中某個(gè)命令出錯(cuò),執(zhí)行的過(guò)程不會(huì)停止,依舊向后繼續(xù)執(zhí)行。這一點(diǎn)并不好,如果命令不涉及改變環(huán)境變量,搭建某某運(yùn)行環(huán)境還好,一旦出錯(cuò),那么定位起來(lái)費(fèi)時(shí)費(fèi)力,所以分號(hào)最好使用在影響小的命令組合中。
這里需要注意一下,和常見(jiàn)編程語(yǔ)言中的邏輯或不太一樣,編程語(yǔ)言中的邏輯或是”條件A或者條件B或者條件C等等條件N,這些條件中有一個(gè)滿足,則整個(gè)表達(dá)式成立“,這里的邏輯或的含義是”命令A(yù)||命令B,命令A(yù)執(zhí)行正確則不執(zhí)行命令B,反之亦然“
對(duì)于一個(gè)你指定的命令,如果他執(zhí)行正確,那么邏輯與的echo suc便會(huì)執(zhí)行,邏輯或便不會(huì)執(zhí)行;倘若命令執(zhí)行失敗,那么邏輯與的echo suc便不會(huì)執(zhí)行,這樣一來(lái),邏輯或的前半部分只有命令執(zhí)行失敗的結(jié)果,所以邏輯或的echo fail便會(huì)執(zhí)行。
“*”在文件搜索的時(shí)候已經(jīng)有所接觸,是匹配任意字符的意思,但是那是限于文件搜索,如果我們使用echo命令來(lái)顯示“*”呢?我們會(huì)發(fā)現(xiàn),echo打印了當(dāng)前目錄下的所有內(nèi)容,而沒(méi)有打印“*”
再試試ls *

在含有“*”的命令中,shell會(huì)在執(zhí)行前將“*”解析為匹配的內(nèi)容,所以echo不認(rèn)識(shí)“*”,沒(méi)有打印他,ls 沒(méi)有因?yàn)闆](méi)有“*”這個(gè)目錄而報(bào)錯(cuò),進(jìn)而正常顯示了當(dāng)前目錄及其子目錄下的所有內(nèi)容。
其他相關(guān)的特殊符號(hào)可以在文件搜索的部分找到,
戳我2:家目錄,“~”
之前提過(guò),使用“cd”和“cd ~”作用相同,都是定位到當(dāng)前用戶的家目錄,如果你在波浪線前面指定一個(gè)用戶,那么會(huì)直接定位到該用戶的家目錄去,就像“cd ~duyt”。
3:算術(shù)表達(dá)式,$((表達(dá)式))
在表達(dá)式中可以填入整數(shù)運(yùn)算的表達(dá)式,儼然一副計(jì)算器的樣子,算術(shù)表達(dá)式支持加減乘除,取余(%),求冪(**)等操作,其中,加減乘除取余,不再贅述,運(yùn)算符和一般編程語(yǔ)言的相同,都是“+-*/”,求冪則寫(xiě)為$((2**10)),這樣便會(huì)輸出2的10次方的結(jié)果。

4:花括號(hào)匹配,{}
這家伙和方括號(hào)“[]”有類似的地方,都能匹配括號(hào)里的內(nèi)容,但是花括號(hào)更常見(jiàn)于這個(gè)場(chǎng)景:你需要新建一些文件,這些文件可能是你馬上使用的日志文件,或者學(xué)習(xí)筆記,甚至是日記,他們的文件名有類似有不同,不同可能是順序的日期或其他數(shù)字,那么花括號(hào)可以幫你完成這個(gè)工作。
touch 2015-01-{01..31},這樣以來(lái),會(huì)馬上新建以順序日期命名的文件,可以省去很多重復(fù)的工作。

刪除的時(shí)候也可以使用花括號(hào)。
花括號(hào)包含以下幾種形式
1:{X,X,X},匹配多個(gè)字符,使用逗號(hào)隔開(kāi)。
2:{1..9},或者{A..Z}等其他類似的寫(xiě)法,這樣寫(xiě)會(huì)匹配一個(gè)范圍內(nèi)的字符。
3:{{X,X},{X,X}},嵌套匹配,這樣寫(xiě)法,是會(huì)產(chǎn)生四種匹配的
但是,花括號(hào)和方括號(hào)又有著不同,方括號(hào)重點(diǎn)在匹配上,而花括號(hào)重點(diǎn)在返回匹配的字符。

這是,編程的感覺(jué)嗎?看看變量和引用
1:變量定義
好簡(jiǎn)單的,“變量名=變量值”,在shell中直接鍵入var=helloworld,那么你就有了一個(gè)var變量!
2:那么引用呢?
也好簡(jiǎn)單的,使用”$變量名”

3:引用一個(gè)命令的結(jié)果,“或者$()
比如:echo `ls`或者 echo $(ls),那么打印的將是當(dāng)前目錄的內(nèi)容

當(dāng)然了,演示的部分很簡(jiǎn)單,只是使用了ls命令,引用可以用在更多復(fù)雜的命令組合和場(chǎng)景中。
控制特殊字符的匹配
1:雙引號(hào)
雙引號(hào)可以用來(lái)控制參數(shù)個(gè)數(shù),排除部分特殊字符的作用。就參數(shù)個(gè)數(shù)而言,當(dāng)你使用echo打印一些字符
echo a b c d,那么echo會(huì)接受4個(gè)參數(shù),打印之后,空格,制表符,換行符等把單詞分割為不同參數(shù)的多余字符會(huì)被過(guò)濾掉。

當(dāng)我們把含有分隔符號(hào)的參數(shù)使用雙引號(hào)引起來(lái),單詞,或者說(shuō)參數(shù)的分割就失效了,命令會(huì)把雙引號(hào)內(nèi)的內(nèi)容作為一個(gè)參數(shù)來(lái)看待。

echo是如此,使用ls的時(shí)候,尤其是ls那些含有分隔符號(hào)的文件名的時(shí)候,雙引號(hào)就能幫你大忙了。
但是在雙引號(hào)中,shell的特殊字符,除了 $,\ (反斜杠),和 `(倒引號(hào))之外, 將會(huì)失去它們的特殊含義,被當(dāng)作普通字符來(lái)看待。這就意味著,剛才提到的參數(shù)分割,星號(hào)(*)匹配, 波浪線(家目錄),和花括號(hào)匹配都將失效。參數(shù)引用,命令結(jié)果引用還有算術(shù)表達(dá)式仍然生效。

2:?jiǎn)我?hào),完全失效!
是的,單引號(hào)引起來(lái)的所有內(nèi)容都會(huì)原樣輸出,所有特殊字符都會(huì)失效功能!
3:轉(zhuǎn)義字符,反斜杠
有些時(shí)候,顯示出個(gè)別特殊字符正式我們所需要的,這時(shí)候,反斜杠就可以幫到我們。就比如,過(guò)去我們常常聽(tīng)到“襯衫的價(jià)格是九磅十五便士”,那么貨幣單位就有可能需要轉(zhuǎn)義,原樣顯示。當(dāng)然了,美元符號(hào)才需要轉(zhuǎn)義,英鎊不需要。

不過(guò)要注意,某些組合是有特殊含義的
\t:按下tab鍵,這可是制表符
\r:回車符號(hào)
\n:新起一行
\b:退格鍵
目前,shell中一些任性的家伙我們已經(jīng)有了一個(gè)初步的認(rèn)識(shí)。