シェルプログラミング(4)

 

シェル関数

 

それは、文の殻又は集合が、コマンドのセットに使用可能なコードセクション、シェル関数と呼ばれるコードブロックが形成されていることができます。このコードは、あなたが直接、コードの次のセクションを呼び出すことができ、関数名に名前呼ばれています。

 

フォーマット

FUNC(){#関数名指定

コマンド#関数本体

}

 

例1:

コードをコピー
#!/ binに/ bashのの
FUNC(){ 
エコーは"これは、関数です。" 
} 
FUNC 

#1のbash test.sh 
これは関数です。
コードをコピー

Shell関数は、二重括弧に続く関数名は非常にシンプルであるダブルトークブレース。括弧なしの関数名による直接呼び出し、。

 

例2:関数の戻り値

コードをコピー
#!/ binに/ bashのの
FUNC(){ 
VAR = $((1 + 1))
のリターンの$ VARの
エコー"これは、関数です。" 
} 
funcを
エコー$?

#のbash test.sh 
2
コードをコピー

関数の戻り値は、ステータスを返すように定義されたバックと終了関数が、数字は0から255までを返すことができ、同様の終了。

 

例3:関数のパラメータの受け渡し

コードをコピー
#!/ binに/ bashのの
FUNC(){ 
エコー"こんにちは$ 1" 
} 
FUNC世界
#1のbash test.sh 
こんにちは、世界
コードをコピー

シェルパラメータは関数に位置パラメータを通過します。

 

正規表現をシェル

 

各言語での正規表現は、関数は、文字列と行にあなたの期待を一致させることです、必要があります。

シェルの正規表現は、二つのタイプに分けられます。

  •  基本的な正規表現
  • ,,式は+を拡張しました|と():正規表現を拡張?

 

  1. 正規表現は、テキストを大量に処理することです|文字列定義されたルールとメソッドのセット
  2. 定義により、これらの特別な補助シンボルは、システム管理者はすぐに、フィルタ交換したり、文字列を所望の出力することができます。Linuxの正規表現は、一般的に単位で処理されています。

 

正規表現とワイルドカードは、本質的に異なっています

 

 

  1. 判定方法は、思考を必要としない:三銃士のawk、sedは、grepのを、定期的なegrepあり、他はワイルドカードです
  2. 正規表現とワイルドカードの最も簡単な方法の違い:

(1)ファイルのディレクトリ名===>ワイルドカード
              (2)ファイルの内容(文字列[ファイル]テキストコンテンツ)===>正規表現

 

ここでは、説明するためのgrepツールを取得し、いくつかの一般的な正規表現の表記法です。

注:一致モードでは引用符で囲む必要があります

 

                  シンボル                         説明                                例
任意の1文字に一致します(存在している必要があります) 例:l..e

 

それは表現することができます

以下のような

LEEE

表されていません

labcde

インクルード

風下

^ 文字列の前に試合の始まり ABCで始まる行をマッチング:

 

エコー-e「ABC \ nxyz」| grepを^ ABC

$ 文字列のフロントエンドをマッチング 最後にラインをマッチングエクシーズ:

 

エコー-e「ABC \ nxyz」| grepをするのxyz $

* 直前の文字がゼロ以上にマッチします *は、状況に任意の数を示し、

 

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]+’

?(扩展正则) 表示其前面的字符出现最多一次的情况(可以0个) 匹配 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
# echo “hi,root,iamroot” | grep “\<root\>”
hi,root,iamroot

 

 

\>  锚定单词尾部(单词一般以空格或特殊字符做分隔,) # echo “hi,root,iamroot” | grep “\<root”
hi,root,iamroot
# 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

 

 

总结

 

正则表达式

 

一、字符匹配

.

[]

[^]

 

二、次数匹配

*

\{m,n\}

 

三、锚定

^

$

\<

\>

 

四、分组

\(\)

\1

 

扩展正则表达式

grep -E

egrep

 

一、字符匹配

.

[]

[^]

 

二、次数匹配

*

{m,n}

+ 表示其前面的字符出现最少一次的情况

?表示其前面的字符出现最多一次的情况

 

三、锚定

^

$

\<

\>

 

四、分组

()

\1

\2

 

五、或

|

 

一.、正则表达式中的{}以及()都需要加上\进行转义,而扩展正则表达式不需要

二 、|, ?,+是扩展正则独有的

三、 锚定单词首部和尾部在扩展正则以及正则中都需要加上\

 

                                  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:] 标点符号字符
[:xdigit:] 十六进制

 

注意:使用这些字符的时候需要在外面还要加一个[]括号

说一下[:space:]

コードをコピー
[root@ken ~]# cat test    #文本内容
#!/bin/bash
if [ 1 -eq 1 ];
then    echo "yes"
else    echo "no"
fi
AJDLAJDL
LAJLDJA
JDKAJkjskdjklaskj
lsdjal0dlkakm

[root@ken ~]# grep '[[:space:]]' test   #过滤出包含空格的行,[:space:]括号外面还要再包含一个[]
if [ 1 -eq 1 ];
then    echo "yes"
else    echo "no"

[root@ken ~]# grep ' ' test #也可以使用一个空格来代替[:space:] if [ 1 -eq 1 ]; then echo "yes" else echo "no"
コードをコピー

 

正则练习

 

ファイル/etc/init.d/functionsを使用して、以下が一致しなかった例タイトルマッチのいくつかの一部であってもよいです。

1.フィルタラインは、大文字を含みます

2.マッチング数字以外の文字

3.行のB、最初の行の濾過します

ツーアップのC 4からCの最小値があるとBマッチラインとの間にあります

5.#で始まるに濾過し、2番目の文字は、スペースを含む行です

6.旅行の同ラインは、ラインフィルタ文字で始まります

7.濾過#は、最初の文字であり、第2の文字列は空ではなく、デジタルラインの終わり

/etc/init.d/functionsの同じ数を含有する濾過行ライン8

 

 

 

 

回答:

1。

[ルート県〜@]#のはgrep "[AZ]" /etc/init.d/functionsを

 

2。

[ルート県〜@]#のはgrep "[^ 0-9]" /etc/init.d/functions

 

3。

[ルート@県〜]#1はgrep "* B" /etc/init.d/functions

 

4.(一致しません)

#1のgrep "交流\ {2,5 \} B" /etc/init.d/functions [ケン〜@ルート]

 

5。

[ルート県〜@]#のはgrep "^#は[[:スペース:]]" /etc/init.d/functionsを

 

6.(一致しません)

[ルート@県〜]#のはgrep "^ \([AZ] \)。* \ 1 $" /etc/init.d/functions

 

7.(一致しません)

[ルート@県〜]#のはgrep "^#[^ [:スペース:]] * [0-9] $" /etc/init.d/functions

 

8。

#1のegrep [ケン〜@ルート]」。*([0-9])。* \ 1" /etc/init.d/functions

 

おすすめ

転載: www.cnblogs.com/it-peng/p/11404447.html