Shell命令中的特殊替換、模式匹配替換、字符串提取和替換的實(shí)現(xiàn)
形式 | 說明 |
---|---|
${var} | 變量本來的值 |
${var:-word} | 如果變量 var 為空或已被刪除(unset),那么返回 word,但不改變 var 的值。 |
${var:=word} | 如果變量 var 為空或已被刪除(unset),那么返回 word,并將 var 的值設(shè)置為 word。 |
${var:?message} | 如果變量 var 為空或已被刪除(unset),那么將消息 message 送到標(biāo)準(zhǔn)錯(cuò)誤輸出,可以用來檢測(cè)變量 var 是否可以被正常賦值。 若此替換出現(xiàn)在Shell腳本中,那么腳本將停止運(yùn)行。 |
${var:+word} | 如果變量 var 被定義,那么返回 word,但不改變 var 的值。 |
特殊替換
${var:-string},${var:+string},${var:=string},${var:?string}
①${var:-string}和${var:=string}:若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時(shí),則用變量var的值來替換${var:-string};不同之處是${var:=string}常用于判斷var是否賦值,沒有的話則給var賦上一個(gè)默認(rèn)值。
② ${var:+string}:替換規(guī)則和上面的相反,即只有當(dāng)var不是空的時(shí)候才替換成string,若var為空時(shí)則不替換或者說是替換成變量 var的值,即空值。(因?yàn)樽兞縱ar此時(shí)為空,所以這兩種說法是等價(jià)的)
③${var:?string}:替換規(guī)則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標(biāo)準(zhǔn)錯(cuò)誤中,并從腳本中退出。我們可利用此特性來檢查是否設(shè)置了變量的值。
注意:在上面這五種替換結(jié)構(gòu)中string不一定是常值的,可用另外一個(gè)變量的值或是一種命令的輸出。
模式匹配替換
${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
# 是去掉左邊(在鍵盤上#在$之左邊);% 是去掉右邊(在鍵盤上%在$之右邊);#和%中的單一符號(hào)是最小匹配,兩個(gè)相同符號(hào)是最大匹配。
第一種模式:${variable%pattern}。shell在variable中查找,看它是否一給的模式pattern結(jié)尾,如果是,把variable去掉右邊最短的匹配模式
第二種模式: ${variable%%pattern},這種模式時(shí),shell在variable中查找,看它是否一給的模式pattern結(jié)尾,如果是,把variable中去掉右邊最長的匹配模式
第三種模式:${variable#pattern} 這種模式時(shí),shell在variable中查找,看它是否一給的模式pattern開始,如果是,把variable中去掉左邊最短的匹配模式
第四種模式: ${variable##pattern} 這種模式時(shí),shell在variable中查找,看它是否一給的模式pattern結(jié)尾,如果是,把variable中去掉左邊最長的匹配模式
這四種模式中都不會(huì)改變variable的值,其中,只有在pattern中使用了*匹配符號(hào)時(shí),%和%%,#和##才有區(qū)別。結(jié)構(gòu)中的pattern支持通配符,*表示零個(gè)或多個(gè)任意字符,?表示僅與一個(gè)任意字符匹配,[...]表示匹配中括號(hào)里面的字符,[!...]表示不匹配中括號(hào)里面的字符。
# var=testcase # echo $var testcase # echo ${var%s*e} testca # echo $var testcase # echo ${var%%s*e} te # echo ${var#?e} stcase # echo ${var##?e} stcase # echo ${var##*e} # echo ${var##*s} e # echo ${var##test} case
字符串提取和替換
${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}
第一種模式:${var:num},shell在var中提取第num個(gè)字符到末尾的所有字符。若num為正數(shù),從左邊0處開始;若num為負(fù)數(shù),從右邊開始提取字串,但必須使用在冒號(hào)后面加空格或一個(gè)數(shù)字或整個(gè)num加上括號(hào),如${var: -2}、${var:1-3}或${var:(-2)}。
第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個(gè)位置開始提取長度為$num2的子串。不能為負(fù)數(shù)。
第三種模式:${var/pattern/pattern}表示將var字符串的第一個(gè)匹配的pattern替換為另一個(gè)pattern。
第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個(gè)pattern。
[root@centos ~]# var=/home/centos [root@centos ~]# echo $var /home/centos [root@centos ~]# echo ${var:5} /centos [root@centos ~]# echo ${var: -6} centos [root@centos ~]# echo ${var:(-6)} centos [root@centos ~]# echo ${var:1:4} home [root@centos ~]# echo ${var/o/h} /hhme/centos [root@centos ~]# echo ${var//o/h} /hhme/cenths
對(duì){}和()而言, 括號(hào)中 的重定向符只影響該條命令, 而 括號(hào)外 的重定向符影響到括號(hào)中的所有命令。
到此這篇關(guān)于Shell命令中的特殊替換、模式匹配替換、字符串提取和替換的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Shell命令替換內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Linux下的sudo及其配置文件/etc/sudoers的詳細(xì)配置
這篇文章主要介紹了詳解Linux下的sudo及其配置文件/etc/sudoers的詳細(xì)配置的相關(guān)資料,需要的朋友可以參考下2017-05-05shell腳本轉(zhuǎn)發(fā)80端口數(shù)據(jù)包給Node.js服務(wù)器
開發(fā)基于Node.js的WEB應(yīng)用很方便,但是服務(wù)端口問題很蛋疼,由于Linux內(nèi)核規(guī)定普通用戶只能使用大于1024的端口號(hào),所以使用普通用戶運(yùn)行Node.js服務(wù)就不能監(jiān)聽80端口2014-03-03Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動(dòng)腳本分享
這篇文章主要介紹了Shell實(shí)現(xiàn)判斷進(jìn)程是否存在并重新啟動(dòng)腳本分享,本文給出了兩個(gè)實(shí)現(xiàn)腳本,分簡潔版和詳細(xì)版,需要的朋友可以參考下2014-09-09Linux中使用Shell腳本查看Java線程的CPU使用情況
這篇文章主要介紹了Linux中使用Shell腳本查看Java線程的CPU使用情況,需要的朋友可以參考下2014-06-06shell腳本實(shí)現(xiàn)實(shí)時(shí)檢測(cè)文件變更
這篇文章主要介紹了shell腳本實(shí)現(xiàn)實(shí)時(shí)檢測(cè)文件變更,本文直接給出實(shí)現(xiàn)代碼和使用方法,以及svn下的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-05-05Linux下使用shell腳本自動(dòng)執(zhí)行腳本文件
這篇文章主要介紹了Linux下使用shell腳本自動(dòng)執(zhí)行腳本文件的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12