所有的計(jì)算機(jī)程序都是用來和數(shù)據(jù)打交道的。我們一直專注于處理文件級(jí)別的數(shù)據(jù)。然而,許多程序問題需要使用更小的數(shù)據(jù)單位來解決,比方說字符串和數(shù)字。shell 提供了各種執(zhí)行字符串操作的參數(shù)展開功能。除了算術(shù)展開,還有一個(gè)常見的命令行程序叫做bc,能執(zhí)行更高級(jí)別的數(shù)學(xué)運(yùn)算。
1.參數(shù)展開
a.基本參數(shù)
例如:$a
當(dāng)$a 展開后,會(huì)變成變量a 所包含的值。簡單參數(shù)也可能用花括號(hào)引起來:${a}
可以試圖創(chuàng)建一個(gè)文件名,通過把字符串“ file”附加到變量a 的值的后面,例如,訪問第11個(gè)位置參數(shù),可以輸入:${11}。
b.管理空變量的展開
幾種用來處理不存在和空變量的參數(shù)展開形式對(duì)于解決丟失的位置參數(shù)和給參數(shù)指定默認(rèn)值的情況很方便,如
(1)${parameter:-word},若parameter 沒有設(shè)置(不存在)或者為空,展開結(jié)果是word 的值。若parameter不為空,則展開結(jié)果parameter 的值。
(2)${parameter:=word},若parameter 沒有設(shè)置或?yàn)榭眨归_結(jié)果是word 的值。另外,word 的值會(huì)賦值給parameter。若parameter 不為空,展開結(jié)果是parameter 的值。
(3)${parameter:?word},若parameter 沒有設(shè)置或?yàn)榭眨@種展開導(dǎo)致腳本帶有錯(cuò)誤退出,并且word 的內(nèi)容會(huì)發(fā)送到標(biāo)準(zhǔn)錯(cuò)誤。若parameter 不為空,展開結(jié)果是parameter 的值。
(4)${parameter:+word},若parameter 沒有設(shè)置或?yàn)榭?,展開結(jié)果為空。若parameter 不為空,展開結(jié)果是word 的值會(huì)替換掉parameter 的值;然而parameter 的值不會(huì)改變。
2.返回變量名的參數(shù)展開
shell 具有返回變量名的能力,會(huì)用在一些相當(dāng)獨(dú)特的情況下,如${!prefix},${!prefix@}
a.字符串展開
${#parameter}展開成由parameter 所包含的字符串的長度。通常,parameter 是一個(gè)字符串;然而,如果parameter 是@ 或者是 的話,則展開結(jié)果是位置參數(shù)的個(gè)數(shù)。
${parameter:offset}${parameter:offset:length}這些展開用來從parameter 所包含的字符串中提取一部分字符。提取的字符始于第offset個(gè)字符(從字符串開頭算起)直到字符串的末尾,除非指定提取的長度。
*若offset 的值為負(fù)數(shù),則認(rèn)為offset 值是從字符串的末尾開始算起,而不是從開頭。注意負(fù)數(shù)前面必須有一個(gè)空格,為防止與${parameter:-word} 展開形式混淆length,若出現(xiàn),則必須不能小于零。
b.大小寫轉(zhuǎn)換
declare 命令可以用來把字符串規(guī)范成大寫或小寫字符。使用declare 命令,我們能強(qiáng)
制一個(gè)變量總是包含所需的格式,無論如何賦值給它。
${parameter?} 把parameter 的值全部展開成小寫字母。
${parameter,} 僅僅把parameter 的第一個(gè)字符展開成小寫字母。
${parameter??} 把parameter 的值全部轉(zhuǎn)換成大寫字母。
${parameter?} 僅僅把parameter 的第一個(gè)字符轉(zhuǎn)換成大寫字母。
在腳本中這些小零碎可以完成“真正的工作”。隨著我們編寫腳本經(jīng)驗(yàn)的增加,能夠有效地操作字符串和數(shù)字的能力將具有極為重要的價(jià)值。