shell編程之函數與正則表達式

shell函數linux

shell中容許將一組命令集合或語句造成一段可用代碼,這些代碼塊稱爲shell函數。給這段代碼起個名字稱爲函數名,後續能夠調用該段代碼。正則表達式

格式:shell函數很簡單,函數名後跟雙括號,在跟雙大括號。經過函數名直接調用,不加小括號shell

  func () {  #指定函數名bash

  command  #函數體函數

  }blog

  實例:1字符串

    #!/bin/bashit

    func () {table

    echo "這裏是怪人的地盤"test

    }

    func

    

    bash test.sh

    這裏是怪人的地盤

   

 

   實例:2

    函數返回值

    #!/bin/bash

    func () {

    VAR=$((1+1))

    return $VAR

    echo "這裏是怪人的地盤"

    }

    func

    echo $?

    

    bash test.sh

    2

    return 在函數中定義狀態返回值,返回並終止函數,單反毀的只能是0-255的數字,相似於exit

 

   實例:3 

    函數傳參

    #!/bin/bash

    func () {

    echo "Hello $1"

    }

    func world

 

    bash test.sh

    Hello world

    經過shell位置參數給函數傳參

shell正則表達式

正則表達式在每種語言中都有,功能就是匹配符合你預期要求的字符串

shell正則分爲兩種:

  基礎正則表達式

  擴展正則表達式:+ ? | ()

1.正則表達式就是爲了處理大量的文本|字符串而定義的一套規則和方法

2.經過定義的這些 特殊符號的輔助,系統管理員就能夠快速過濾,替換或輸出須要的字符串,linux正則表達式通常以行爲單位處理

 

正則表達式和通配符的本質區別

1.不須要思考的判斷方法,在三劍客awk,sed,grep中都是正則,其餘的都是通配符

2.區別通配符和正則表達式最簡單的方法

  (1)匹配文件目錄名====》通配符

  (2)匹配文件內容====》正則表達式

以grep爲例舉例說明正則表達式

    注意:在匹配模式中必定要加上引號

符號 描述 實例
. 匹配單個必須存在的字符

l..e

能夠表示

love

like

leee

不能夠表示的

labcde

le

lee

^ 匹配以「」開頭的行

匹配以 abc 開頭的行:

echo -e "abc\nxyz" |grep ^abc

$ 匹配以「」結尾的行

匹配以 xyz 結尾的行:

echo -e "abc\nxyz" |grep xyz$

* 前面字符出現零到屢次

a*  表示出現任意個a的狀況

a*b 表示b前面有任意個a的狀況(包括沒有a的狀況)

.* 表示任意字符出現零到屢次

過濾出一行中a在前,b在後的行

條件:

包含 a 和 b

字母 a 必須在 b前面

# grep --color "a.*b" b.txt

+(擴展正則) 表示前面字符出現至少一次

匹配 abc 和 abcc:

echo -e "abc\nabcc\nadd" |grep -E 'ab+'

匹配單個數字:echo "113" |grep -o '[0-9]'

連續匹配多個數字:echo "113" |grep -E -o '[0-9]+'

?(擴展正則) 表示前面字符最多出現一次

匹配 ac 或 abc:

echo -e "ac\nabc\nadd" |grep -E 'a?c'

[] 表示範圍內的一個字符

例子:過濾出包含小寫字母的行       grep [a-z] a.txt

例子:過濾出包含大寫字母的行       grep [A-Z] a.txt

例子:過濾出包含數字的行           grep [0-9] a.txt

例子:過濾出包含數字和小寫字母的行 grep [0-9a-z] a.txt

例子:過濾出包含字母asf的行        grep [asf] a.txt

[.-.] 匹配括號中的任意一個字符

匹配全部字母

echo -e "a\nb\nc" |grep '[a-z]'

[^] 匹配除了某字符的任意一個字符

匹配 a 或 b:

echo -e "a\nb\nc" |grep '[^c-z]'

匹配末尾數字:echo "abc:cde;123" |grep -E

'[^;]+$'

^[^] 匹配除了某字符開頭的行

匹配不是#開頭的行:

grep '^[^#]' /etc/httpd/conf/httpd.conf

{n}或{n,}

{n}:表示嚴格匹配n個字符

{n,}:表示花括號錢的字符至少存在n個

echo "aadadccc" | egrep "a{2}"

echo "aadadccc" | egrep "a{1}"

{n,m}

匹配字符至少出現n次,最多出現m次

"ac\{2,5\}b" 匹配a和b之間有最少2個c最多5個c的行

"ac\{,5\}b" 匹配a和b之間有最多5個c的行

"ac\{2,\}b" 匹配a和b之間有最少2個c的行

\< 錨定單詞首部(匹配字符必須以錨定字符開頭) # echo "hi,root,iamroot" | grep "\<root"
hi,root,iamroot
\> 錨定單詞尾部(匹配字符必須以錨定字符結尾) # echo "hi,root,iamroot" | grep "root\>"
hi,root,iamroot
() \1 調用前面的第一個分組

例子:過濾出一行中有兩個相同數字的行

# grep "\([0-9]\).*\1" inittab

例子:過濾出行首和行位字母相同的行

# grep "^\([a-z]\).*\1$" inittab

|(擴展正則) 匹配 | 兩邊的任意一個

過濾出cat 或者Cat

# grep "cat|Cat" a.txt

# grep "(C|c)at" a.txt

總結

 

正則表達式

1、字符匹配

.

[]

[^] 

2、次數匹配

*

\{m,n\} 

3、錨定

^

$

\<

\> 

4、分組

  \(\)

  \1

擴展正則表達式

grep -E

egrep

1、字符匹配

.

[]

[^]

2、次數匹配

*

{m,n}

+ 表示其前面的字符出現最少一次的狀況

?表示其前面的字符出現最多一次的狀況

3、錨定

^

$

\<

\>

4、分組

  ()

  \1

  \2

5、或

|

一.、正則表達式中的{}以及()都須要加上\進行轉義,而擴展正則表達式不須要

二 、|, ?,+是擴展正則獨有的

3、 錨定單詞首部和尾部在擴展正則以及正則中都須要加上\

相關文章
相關標籤/搜索