本文關鍵詞:shell 判斷、grep正則表達式使用和貪婪匹配理解 1. if [ $a -le $b ], 一開始自學的時候我以為 [ ... ] 就是普通的,語法規定的結構,結果其實人家是"test"的變體,它的效果等同於使用 " test ... ",結果是將指令 ... 執行完了以後輸出出來 ...
本文關鍵詞:shell 判斷、grep正則表達式使用和貪婪匹配理解
1. if [ $a -le $b ], 一開始自學的時候我以為 [ ... ] 就是普通的,語法規定的結構,結果其實人家是"test"的變體,它的效果等同於使用 " test ... ",結果是將指令 ... 執行完了以後輸出出來的東西作為返回值。註意,他並不是能執行所有的命令,作為“判斷符號”,他要求裡面的指令運行結果是 TRUE 或者 FALSE。
2. 如果xxx,就輸出xxx,除了使用 if 判斷語句來實現以外,還可以用 [ xxxx ] && echo xxxx && xxxxx 這樣的方式來實現。原理是當一條指令執行完,只要沒有報錯,而且他不是一個判斷式,那麼它就會返回一個 TRUE ,因此想剛纔那種寫法就能用一個判斷式子寫出一連串的後續操作。不過感覺最好不要用這個方法寫太長,代碼會很不好看的。
3. 多條件判斷有兩種寫法哦! [ $xxx == xxx -o/-a $yyy == yyy ] 和 [ $xxx == xxx ] ||/&& [ $yyy == yyy ] 都可以。值得註意的是,前後要留有空格才可以,並且使用 || 和 && 要在 [ ] 的外面才行。
4.[ "$xxx" == "xxx" ] 才是最穩妥的寫法,不然bash會出各種奇奇怪怪的問題。
5.對於bash,它概念里的塊作用域(BlockScope,JavaScript 說法)用小括弧()包裹。所謂塊作用域,是說在這個區域內定義的變數,離開這個區域無法被訪問到,大致和Java裡面的局部變數比較類似,也類似於JS裡面的 “let” 關鍵字定義的變數。
6.grep 命令在使用的時候可以通過管道來增強其他命令的效果,比如 which bin | grep 'username' 就可以查找路徑裡面帶有username字元串的bin文件夾的位置咯。註意,單引號不要省略,因為在寫正則表達式的時候,沒有單引號轉義字元 \ 將工作不正常!
對於Bash,七條命令有五種不同的含義(下麵的x<n>代表n個字母)。他們分別是:(1,2,7)查找“x\{0-2}”;(3)查找“x\{0-4}”;(4)查找“x\{0-4\}”;(5)查找一個0-4字母組成的字元串;(6)語法錯誤。
為什麼上面的例子中明明是 \{0,4\} 卻標紅了五個字母?我的理解是adsfx中,按照正則表達式貪婪匹配(能標紅最多字元的方式匹配)原則,字元串裡面找到了第一個匹配表達式的字元之後,還會繼續向右尋找符合要求的字元串,於是就,按照"x0"這個條件把全文所有字母標紅了。實際上,他匹配到的是這樣一個數組:
[ 'adsf','x','dad' ]。
下麵的圖就能更清楚地顯示這一點!
這三個體現了貪婪匹配的原則——儘可能標出最多的字元。註意x後面那是個 1 不是 l。
為什麼" 52148962asdfaadsfx1dad4248 "裡面沒有繼續匹配比如"sdfaad"這樣的串呢?因為已經匹配的串asdfaa已經不能參與匹配了,剩下的dsfx只有四個字母,不符合要求了!
那麼非貪婪匹配是怎麼一回事?非貪婪匹配又叫做懶惰匹配,grep原生不支持這種匹配模式,需要加上 -P 使用Perl語法才能執行,只需要在量詞後面加上?(直接加,不要有任何的空格)就可以!
非貪婪匹配返回的結果是儘可能短的(而不是儘可能長),一般用於".*"這種廣泛匹配上,比如下麵的例子,諸位好漢可以猜一猜他們的輸出結果是什麼,以及為什麼這樣輸出(輸出在綠色的方塊下麵):
練習題(?)
我自己的一些看法,不知道有無錯誤,希望各位看官如果有空,和我討論一下