Shell基石:模式匹配

shell基礎(chǔ)

模式匹配在Shell腳本中的運用很廣泛妓湘。
舉幾個栗子:

"三元運算符"

#!/usr/bin/env bash
x=${1:-"hello"}
echo $x
# 打印第一個參數(shù)(默認hello)

在上述例子中雄嚣,x=${1:-"hello"} 中的 1:- 可以理解為三元運算符的匹配條件,表達的含義是,如果參數(shù)列表中 $1 的值不為空鸣个,則 x 值為 $1辑畦,否則值為"hello"吗蚌。表達式中的 - 則可以理解為是該表達式的匹配模式,另外還有 + = ? 三種模式:

  • ${var:-string}和${var:=string}:若變量var為空纯出,則用在命令行中用string來替換${var:-string}蚯妇,否則變量var不為空時敷燎,則用變量var的值來替換${var:-string};對于${var:=string}的替換規(guī)則和${var:-string}是一樣的箩言,所不同之處是${var:=string}若var為空時硬贯,用string替換${var:=string}的同時,把string賦給變量var: ${var:=string}很常用的一種用法是陨收,判斷某個變量是否賦值饭豹,沒有的話則給它賦上一個默認值。

  • ${var:+string}的替換規(guī)則和上面的相反务漩,即只有當var不是空的時候才替換成string拄衰,若var為空時則不替換或者說是替換成變量 var的值,即空值饵骨。(因為變量var此時為空肾砂,所以這兩種說法是等價的)

  • ${var:?string}替換規(guī)則為:若變量var不為空,則用變量var的值來替換${var:?string}宏悦;若變量var為空镐确,則把string輸出到標準錯誤中,并從腳本中退出饼煞。我們可利用此特性來檢查是否設(shè)置了變量的值源葫。
    補充擴展:在上面這五種替換結(jié)構(gòu)中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出砖瞧。

模式匹配記憶方法:
# 是去掉左邊(在鍵盤上#在$之左邊)
% 是去掉右邊(在鍵盤上%在$之右邊)
# 和 % 中的單一符號是最小匹配息堂,兩個相同符號是最大匹配。

${var%pattern}, ${var%%pattern}, ${var#pattern}, ${var##pattern}

  • 第一種模式:${variable%pattern}块促,這種模式時荣堰,shellvariable 中查找,看它是否一給的模式 pattern 結(jié)尾竭翠,如果是振坚,就從命令行把 variable 中的內(nèi)容去掉右邊最短的匹配模式;
  • 第二種模式: ${variable%%pattern}斋扰,這種模式時渡八,shellvariable 中查找,看它是否一給的模式 pattern 結(jié)尾传货,如果是屎鳍,就從命令行把 variable 中的內(nèi)容去掉右邊最長的匹配模式;
  • 第三種模式:${variable#pattern} 這種模式時问裕,shellvariable 中查找逮壁,看它是否一給的模式 pattern 開始,如果是粮宛,就從命令行把 variable 中的內(nèi)容去掉左邊最短的匹配模式窥淆;
  • 第四種模式: ${variable##pattern} 這種模式時十饥,shellvariable 中查找,看它是否一給的模式 pattern 結(jié)尾祖乳,如果是,就從命令行把 variable 中的內(nèi)容去掉右邊最長的匹配模式秉氧;
  • 這四種模式中都不會改變 variable 的值眷昆,其中,只有在 pattern 中使用了 * 匹配符號時汁咏,%%%亚斋,### 才有區(qū)別。結(jié)構(gòu)中的 pattern 支持通配符攘滩,* 表示零個或多個任意字符帅刊,? 表示僅與一個任意字符匹配,[...] 表示匹配中括號里面的字符漂问,[!...] 表示不匹配中括號里面的字符赖瞒。
# 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個字符到末尾的所有字符栏饮。若num為正數(shù),從左邊0處開始磷仰;若num為負數(shù)袍嬉,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數(shù)字或整個num加上括號灶平,如${var: -2}伺通、${var:1-3}或${var:(-2)}。
  • 第二種模式:${var:num1:num2}逢享,num1是位置罐监,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串瞒爬。不能為負數(shù)笑诅。
  • 第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。
  • 第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。
var=/home/centos
# echo $var
/home/centos
# echo ${var:5}
/centos
# echo ${var: -6}
centos
# echo ${var:(-6)}
centos
# echo ${var:1:4}
home
# echo ${var/o/h}
/hhme/centos
# echo ${var//o/h}
/hhme/cenths

end.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末邻耕,一起剝皮案震驚了整個濱河市肴盏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌妇多,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件燕侠,死亡現(xiàn)場離奇詭異者祖,居然都是意外死亡立莉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門七问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜓耻,“玉大人,你說我怎么就攤上這事械巡∩蔡剩” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵讥耗,是天一觀的道長有勾。 經(jīng)常有香客問我,道長古程,這世上最難降的妖魔是什么蔼卡? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮挣磨,結(jié)果婚禮上雇逞,老公的妹妹穿的比我還像新娘。我一直安慰自己茁裙,他們只是感情好喝峦,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著呜达,像睡著了一般谣蠢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上查近,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天眉踱,我揣著相機與錄音,去河邊找鬼霜威。 笑死谈喳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的戈泼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膛壹!你這毒婦竟也來了肩民?” 一聲冷哼從身側(cè)響起持痰,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后薪者,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體言津,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年猿棉,在試婚紗的時候發(fā)現(xiàn)自己被綠了萨赁。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片杖爽。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖精置,靈堂內(nèi)的尸體忽然破棺而出脂倦,到底是詐尸還是另有隱情蝶押,我是刑警寧澤棋电,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響烘浦,放射性物質(zhì)發(fā)生泄漏闷叉。R本人自食惡果不足惜握侧,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一秽五、第九天 我趴在偏房一處隱蔽的房頂上張望盲再。 院中可真熱鬧答朋,春花似錦、人聲如沸洪规。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春履怯,著一層夾襖步出監(jiān)牢的瞬間柠硕,已是汗流浹背工禾。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蝗柔,地道東北人闻葵。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像癣丧,于是被迫代替她去往敵國和親槽畔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理胁编,服務(wù)發(fā)現(xiàn)厢钧,斷路器,智...
    卡卡羅2017閱讀 134,601評論 18 139
  • linux shell:[1] ()萤彩、(())、[]级及、[[]]乒疏、{}使用方法 1.() 命令組。括號中的命令將會新...
    techping閱讀 4,294評論 0 1
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法饮焦,類相關(guān)的語法怕吴,內(nèi)部類的語法,繼承相關(guān)的語法县踢,異常的語法转绷,線程的語...
    子非魚_t_閱讀 31,587評論 18 399
  • shell中各種括號的使用方法(摘自網(wǎng)絡(luò)) 在這里我想說的是幾種shell里的小括號,大括號結(jié)構(gòu)和有括號的變量,命...
    草中人閱讀 518評論 0 0
  • 《小狗錢錢》這個理財入門讀本硼啤,我在好多關(guān)于理財?shù)恼n程或者文章中看到過對這本書的推薦议经,雖然以前好奇看過一遍,這...
    行走在路上呢閱讀 274評論 0 0