Shell 函數(shù)、數(shù)組與正則表達(dá)式

2018-06-08 17:07 更新

防偽碼:白日依山盡,黃河入海流。

5.1  函數(shù)

格式:

func() {

command

}

示例 1:

#!/bin/bash

func() {

echo "This is a function."

}

func

# bash test.sh

This is a function.


Shell 函數(shù)很簡(jiǎn)單,函數(shù)名后跟雙括號(hào),再跟雙大括號(hào)。通過函數(shù)名直接調(diào)用,不加小括號(hào)。

示例 2:函數(shù)返回值

#!/bin/bash

func() {

VAR=$((1+1))

return $VAR

echo "This is a function."

}

func

echo $?

# bash test.sh

2

return 在函數(shù)中是定義狀態(tài)返回值,返回并終止函數(shù),但返回的只能是數(shù)字,類似于 exit 0。

示例 3:函數(shù)傳參

#!/bin/bash

func() {

echo "Hello $1"

}

func world

# bash test.sh

Hello world

通過 Shell 位置參數(shù)給函數(shù)傳參。

5.2  數(shù)組

數(shù)組是相同類型的元素按一定順序排列的集合。

格式:

array=(元素 1 元素 2 元素 3 ...)

用小括號(hào)初始化數(shù)組,元素之間用空格分隔。

定義方法 1:初始化數(shù)組

array=(a b c)

定義方法 2:新建數(shù)組并添加元素

array[下標(biāo)]=元素

定義方法 3:將命令輸出作為數(shù)組元素

array=($(command))

數(shù)組操作:

獲取所有元素

# echo ${array[*]} # *和@ 都是代表所有元素

a b c

獲取元素下標(biāo)

# echo ${!a[@]}

0 1 2

獲取數(shù)組長度

# echo ${#array[*]}

3

獲取第一個(gè)元素

# echo ${array[0]}

a

獲取第二個(gè)元素

# echo ${array[1]}

b

獲取第三個(gè)元素

# echo ${array[2]}

c

添加元素

# array[3]=d

# echo ${array[*]}

a b c d

添加多個(gè)元素

# array+=(e f g)

# echo ${array[*]}

a b c d e f g

刪除第一個(gè)元素

# unset array[0] # 刪除會(huì)保留元素下標(biāo)

# echo ${array[*]}

b c d e f g

刪除數(shù)組

# unset array

數(shù)組下標(biāo)從 0 開始。

示例 1:講 seq 生成的數(shù)字序列循環(huán)放到數(shù)組里面

#!/bin/bash

for i in $(seq 1 10); do

array[a]=$i

let a++

done

echo ${array[*]}

# bash test.sh

1 2 3 4 5 6 7 8 9 10

示例 2:遍歷數(shù)組元素

方法 1:

#!/bin/bash

IP=(192.168.1.1 192.168.1.2 192.168.1.3)

for ((i=0;i<${#IP[*]};i++)); do

echo ${IP[$i]}

done

# bash test.sh

192.168.1.1

192.168.1.2

192.168.1.3

方法 2:

#!/bin/bash

IP=(192.168.1.1 192.168.1.2 192.168.1.3)

for IP in ${IP[*]}; do

echo $IP

done

正則表達(dá)式在每種語言中都會(huì)有,功能就是匹配符合你預(yù)期要求的字符串。

Shell 正則表達(dá)式分為兩種:

基礎(chǔ)正則表達(dá)式:BRE(basic regular express)

擴(kuò)展正則表達(dá)式:ERE(extend regular express),擴(kuò)展的表達(dá)式有+、?、|和()

下面是一些常用的正則表達(dá)式符號(hào),我們先拿 grep 工具舉例說明。

符號(hào)描述示例
.

匹配除換行符(\n)之外的任

意單個(gè)字符

匹配 123:

echo -e "123\n456" |grep '1.3'

匹配前面字符串開頭

匹配以 abc 開頭的行:

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

$匹配前面字符串結(jié)尾

匹配以 xyz 結(jié)尾的行:

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

*匹配前一個(gè)字符零個(gè)或多個(gè)

匹配 x、xo 和 xoo:

echo -e "x\nxo\nxoo\no\noo" |grep "xo*"

x 是必須的,批量了 0 零個(gè)或多個(gè)

匹配前面字符 1 個(gè)或多個(gè)

匹配 abc 和 abcc:

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

匹配單個(gè)數(shù)字:echo "113" |grep -o '[0-9]'

連續(xù)匹配多個(gè)數(shù)字:echo "113" |grep -E -o '[0-

9]+'

?匹配前面字符 0 個(gè)或 1 個(gè)

匹配 ac 或 abc:

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

[ ]

匹配中括號(hào)之中的任意一個(gè)

字符

匹配 a 或 c:

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

[ .-.]

匹配中括號(hào)中范圍內(nèi)的任意

一個(gè)字符

匹配所有字母:

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

[^]

匹配[^字符]之外的任意一

個(gè)字符

匹配 a 或 b:

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

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

'[^;]+$'

^[^]

匹配不是中括號(hào)內(nèi)任意一個(gè)

字符開頭的行

匹配不是#開頭的行:

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

{n}或

{n,}

匹配花括號(hào)前面字符至少 n

個(gè)字符

匹配 abc 字符串(至少三個(gè)字符以上字符串):

echo -e "a\nabc\nc" |grep -E '[a-z]{3}'

{n,m}

匹配花括號(hào)前面字符至少 n

個(gè)字符,最多 m 個(gè)字符

匹配 12 和 123(不加邊界符會(huì)匹配單個(gè)字符):

echo -e "1\n12\n123\n1234" |grep -E -w -o '[0-

9]{2,3}'

\< 邊界符,匹配字符串開始

匹配開始是 123 和 1234:

echo -e "1\n12\n123\n1234" |grep -w '\<123'

\>邊界符,匹配字符串結(jié)束

匹配結(jié)束是 1234:

echo -e "1\n12\n123\n1234" |grep '4\>'

( )

單元或組合:將小括號(hào)里面

作為一個(gè)組合

分組:匹配小括號(hào)中正則表

達(dá)式或字符。\n 反向引

用,n 是數(shù)字,從 1 開始編

號(hào),表示引用第 n 個(gè)分組匹

配的內(nèi)容


單元:匹配 123a 字符串

echo "123abc" |grep -E -o '([0-9a-z]){4}'

分組:匹配 11

echo "113abc" |grep -E -o '(1)\1'

匹配出現(xiàn) xo 出現(xiàn)零次或多次:

echo -e "x\nxo\nxoo\no\noo" |egrep "(xo)*"


|匹配豎杠兩邊的任意一個(gè)

匹配 12 和 123:

echo -e "1\n12\n123\n1234" |grep -E '12\>|123\>'

\

轉(zhuǎn)義符,將特殊符號(hào)轉(zhuǎn)成原

有意義

1.2,匹配 1.2:1\.2,否則 112 也會(huì)匹配到
Posix字符描述
[:alnum:] 等效[a-zA-Z0-9]
[:alpha:]  等效[a-zA-Z]
[:lower:]  等效[a-z]
[:upper:]等效[A-Z]
[:digit:]等效[0-9]
[:space:] 匹配任意空白字符,等效[\t\n\r\f\v]
[:graph:]非空白字符
[:blank:] 空格與定位字符
[:cntrl:] 控制字符
[:print:]可顯示的字符
[:punct:] 標(biāo)點(diǎn)符號(hào)字符
[:xdigit:]十六進(jìn)制

示例:

echo -e "1\n12\n123\n1234a" |grep '[[:digit:]]'

在 Shell 下使用這些正則表達(dá)式處理文本最多的命令有下面幾個(gè)工具:

命令描述
grep

默認(rèn)不支持?jǐn)U展表達(dá)式,加-E 選項(xiàng)開啟 ERE。如果不加-E 使用花括號(hào)要加

轉(zhuǎn)義符\{\}

egrep 支持基礎(chǔ)和擴(kuò)展表達(dá)式
awk支持 egrep 所有的正則表達(dá)式
sed

默認(rèn)不支持?jǐn)U展表達(dá)式,加-r 選項(xiàng)開啟 ERE。如果不加-r 使用花括號(hào)要加

轉(zhuǎn)義符\{\}

支持的特殊字符描述
\w匹配任意數(shù)字和字母,等效[a-zA-Z0-9_]
\W與\w 相反,等效[^a-zA-Z0-9_]
\b 匹配字符串開始或結(jié)束,等效\<和\>
\s 匹配任意的空白字符
\S 匹配非空白字符
空白符描述
\n  換行符
\r回車符
\t 水平制表符
\v垂直制表符
\0 空值符
\b 退后一格

謝謝觀看,真心的希望能幫到您!

本文出自 “一盞燭光” 博客,謝絕轉(zhuǎn)載!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)