shell基礎67:執行順序(||及&&,{}及())及正則表運算式

來源:互聯網
上載者:User
From:http://bbs.chinaunix.net/viewthread.php?tid=445229

QUOTE:$ unset A
$ [ -n "$A" ] && [ "$A" -lt 100 ] || echo 'too big!'
too big!

為何上面的結果也可得到呢? 做個記號

網中人第十問
10) && 與 || 差在哪?
http://bbs.chinaunix.net/forum/viewtopic.php?t=218853&show_type=new&postdays=0&postorder=asc&start=60

第六問:
6) exec 跟 source 差在哪?
http://www.chinaunix.net/forum/viewtopic.php?t=194191

總結:
fork:在子行程中的環境如何變更,均不會影響父行程的環境。

正常來說,當我們執行一個 shell script 時,其實是先產生一個 sub-shell 的子行程,然後 sub-shell 再去產生命令列的子行程。
即我們正常運行一個指令碼時:

[Copy to clipboard] [ - ]

CODE:

./my.script

source:所謂 source 就是讓 script 在當前 shell 內執行、而不是產生一個 sub-shell 來執行。
由於所有執行結果均於當前 shell 內完成,若 script 的環境有所改變,當然也會改變當前環境了

[Copy to clipboard] [ - ]

CODE:

source ./my.script
或:
. ./my.script

()和{ }

QUOTE:如果希望把幾個命令合在一起執行, s h e l l提供了兩種方法。既可以在當前s h e l l也可以在子s h e l l中執行一組命令。
1、():
為了在當前s h e l l中執行一組命令,可以用命令分隔字元隔開每一個命令,並把所有的命令用圓括弧()括起來。
它的一般形式為:

[Copy to clipboard] [ - ]

CODE:

(命令1;命令2;. . .)

2、{}:
使用{ }來代替(),那麼相應的命令將在子s h e l l中作為一個整體被執行,只有在{ }中所有命令的輸出作為一個整體被重新導向時,其中的命令才被放到子s h e l l中執行,否則在當前s h e l l執行。它的一般形式為:

[Copy to clipboard] [ - ]

CODE:

{命令1;命令2;. . . }

此段有誤,現更下如下:

[Copy to clipboard] [ - ]

CODE:

(cmd1;cmd2;...;cmdN)#在一個子shell裡執行一組命令
{cmd1;cmd2;...;cmdN}# 在當前shell裡執行一組命令
這是一個基本概念

[jason@firewall jason]$ A=1;echo $A;{ A=2; };echo $A
1
2
[jason@firewall jason]$ A=1;echo $A;( A=2; );echo $A
1
1

{ A=2; }改變了當前shell變數的值
( A=2; )未改變當前shell變數的值

可查看原連結
http://bbs.chinaunix.net/forum/viewtopic.php?show_type=&p=3386007#3386007
多謝指出,呵呵

例一:上面的例子中:

[Copy to clipboard] [ - ]

CODE:

$ comet month_end.txt || exit

現在如果該指令碼執行失敗了,我希望先給自己發個郵件,然後再退出,可以用下面的方法來實現:

[Copy to clipboard] [ - ]

CODE:

$ comet month_end || (echo "Comet did no work" | mail sam ; exit)

上例中由於 只使用了命令分隔字元而沒有把它們組合在一起, s h e l l將直接執行最後一個命令(e x i t)。

例二:下面是原來的那個例子:

[Copy to clipboard] [ - ]

CODE:

$ sort quarter_end.txt > quarter.sorted && lp quarter.sorted

使用命令組合的方法,如果s o r t命令執行成功了,先將輸出檔案拷貝到一個日誌區,然後再列印。

[Copy to clipboard] [ - ]

CODE:

$ sort quarter_end.txt > quarter.sorted && (cp quarter.sorted  /logs/quarter.sorted; lp quarter.sorted)

shell十三問第七問:
7) ( ) 與 { } 差在哪?
http://bbs.chinaunix.net/forum/viewtopic.php?t=218853&show_type=new&postdays=0&postorder=asc&start=45

下面開始正則規剛,由於這部份內容不多,而且論壇裡這類貼子也不少,也以,不重開貼了

以後是論壇裡的正則規則貼子:
Regex文法
http://bbs.chinaunix.net/forum/viewtopic.php?t=149723

貼一篇關於Regex的老文,它對初學者確實很有協助  
http://www.chinaunix.net/forum/viewtopic.php?t=63273

[轉貼]經常使用的Regex舉例
http://www.chinaunix.net/forum/viewtopic.php?t=190716

我常用的Regex  
http://bbs.chinaunix.net/forum/viewtopic.php?t=190088

正則標記法解惑(具體例子請教高手)
http://bbs.chinaunix.net/forum/viewtopic.php?t=247322

正則迷霧,各種工具之Regex文法比較
http://bbs.chinaunix.net/forum/viewtopic.php?t=425827

[原創]論Regex的“貪婪”性
http://www.chinaunix.net/forum/viewtopic.php?t=15825

[Copy to clipboard] [ - ]

CODE:

" 匹配行首與行尾。
" 匹配資料集。
" 只匹配字母和數字。
" 匹配一定範圍內的字串集。

當從一個檔案或命令輸出中抽取或過濾文本時,可以使用Regex( R E),Regex是一些特殊或不很特殊的字串模式的集合。

基本元字元集及其含義

QUOTE: 原帖由 "網中人" 發表:
abc: 表示 abc 三個連續的字元, 但彼此獨立而非集合. (可簡單視為三個 char. set)
(abc): 表示 abc 這三個連續字元的集合. (可簡單視為一個 char. set)
a|b: 表示單一字元, 或 a 或 b .
(abc|xyz): 表示或 abc 或 xyz 這兩個 char. set 之一. (註二)
[abc]: 表示單一字元, 可為 a 或 b 或 c . (與 wildcard 之 [abc] 原理相同)
[^abc]: 表示單一字元, 不為 a 或 b 或 c 即可. (與 wildcard 之 [!abc] 原理相同)
. : 表示任意單一字元. (與 wildcard 之 ? 原理相同)

[Copy to clipboard] [ - ]

CODE:

^ 只只匹配行首
$ 只只匹配行尾
* 只一個單字元後緊跟*,匹配0個或多個此單字元
[ ] 只匹配[ ]內字元。可以是一個單字元,也可以是字元序列。可以使用-
表示[ ]內字元序列範圍,如用[ 1 - 5 ]代替[ 1 2 3 4 5 ]
/ 只用來屏蔽一個元字元的特殊含義。因為有時在s h e l l中一些元字元有
特殊含義。/可以使其失去應有意義
. 只匹配任意單字元
p a t t e r n / { n / } 只用來匹配前面p a t t e r n出現次數。n為次數
p a t t e r n / { n,/ } m 只含義同上,但次數最少為n
p a t t e r n / { n,m / } 只含義同上,但p a t t e r n出現次數在n與m之間
現在詳細講解其中特殊含義。

1、使用句點匹配單字元

例一:beng.n:以b e g開頭,中間夾一個任一字元。
例二:. . . .X C. . . .:共10個字元,前四個之後為XC
例三:列出所有使用者都有寫入權限的目錄或檔案 :

[Copy to clipboard] [ - ]

CODE:

ls -l |grep ...x..x..x

2、行首以^匹配字串或字元序列
^只允許在一行的開始匹配字元或單詞。

例如,使用ls -l命令,並匹配目錄。

[Copy to clipboard] [ - ]

CODE:

$ ls -l | grep ^d

3、在行尾以$匹配字串或字元
可以說$與^正相反,它在行尾匹配字串或字元, $符號放在匹配單詞後。

例一:列出檔案httpd1.conf中所有以單詞common結尾的行

[Copy to clipboard] [ - ]

CODE:

$grep common$ httpd1.conf

$cat httpd1.conf | grep common$

例二:匹配所有空行:^ $

例三:只返回包含一個字元的行:^.$

4、用/屏蔽一個特殊字元的含義

下列字元一般可以認為是特殊字元:

[Copy to clipboard] [ - ]

CODE:

$ . ' " * [] ^ | () / + ?

QUOTE:如:
/ .
反斜線後面的字元不再是特殊字元,而是一個一般字元,即句點。

QUOTE:假定要匹配包含^的各行,將反斜線放在它前面就可以屏蔽其特殊含義:
/ ^

QUOTE:在Regex中匹配以* . p a s結尾的所有檔案:
/ * / . p a s
即可屏蔽字元*的特定含義。

5、使用/{/}匹配模式結果出現的次數
使用*可匹配所有匹配結果任意次,但如果只要指定次數,就應使用/ { / },

QUOTE:此模式有三種形式,即:
pattern/{n/} 匹配模式出現n次。
pattern/{n,/} 匹配模式出現最少n次。
pattern/{n,m} 匹配模式出現n到m次之間,n , m為0 - 2 5 5中任意整數。

例一:匹配字母A出現兩次,並以B結尾:

[Copy to clipboard] [ - ]

CODE:

A / { 2 / } B

匹配值為A A B

例二:匹配A至少4次:

[Copy to clipboard] [ - ]

CODE:

A / { 4 , / } B

可以得結果A A A A B或A A A A A A A B,但不能為A A A B。

例三:如給出出現次數範圍,例如A出現2次到4次之間:

[Copy to clipboard] [ - ]

CODE:

A / { 2 , 4 / } B

則結果為A A B、A A A B、A A A A B,而不是A B或A A A A A B等。

例四:假定從下述列表中抽取代碼:

QUOTE:1234XC9088
4523XX9001
0011XA9912
9931Xc3445

格式如下:前4個字元是數字,接下來是x x,最後4個也是數字,操作如下:
[ 0 - 9 ] / { 4 / }X X[ 0 - 9 ] / { 4 / }

QUOTE:具體含義如下:
1) 匹配數字出現4次。
2) 後跟代碼x x。
3) 最後是數字出現4次。

結果如下

QUOTE:1234XC9088  -no match
4523XX9001  -match
0011XA9912  -no match
9931Xc3445  -no match

經常使用的Regex舉例

[Copy to clipboard] [ - ]

CODE:

^ 對行首
$ 對行尾
^ [ t h e ] 對以t h e開頭行
[ S s ] i g n a [ l L ] 對匹配單詞s i g n a l、s i g n a L、S i g n a l、S i g n a L
[Ss]igna[lL]/. 對同上,但加一句點
[ m a y M A Y ] 對包含m a y大寫或小寫字母的行
^ U S E R $ 對只包含U S E R的行
[tty]$ 對以t t y結尾的行
/ . 對帶句點的行
^ d . . x . . x . . x 對對使用者、使用者組及其他使用者群組成員有可執行許可權的目錄
^ [ ^ l ] 對排除關聯目錄的目錄列表
[ . * 0 ] 對0之前或之後加任一字元
[ 0 0 0 * ] 對0 0 0或更多個
[ iI] 對大寫或小寫I
[ i I ] [ n N ] 對大寫或小寫i或n
[ ^ $ ] 對空行
[ ^ . * $ ] 對匹配行中任一字元串
^ . . . . . . $ 對包括6個字元的行
[a- zA-Z] 對任意單字元
[ a - z ] [ a - z ] * 對至少一個小寫字母
[ ^ 0 - 9 / $ ] 對非數字或美元標識
[ ^ 0 - 0 A - Z a - z ] 對非數字或字母
[ 1 2 3 ] 對1到3中一個數字
[ D d ] e v i c e 對單詞d e v i c e或D e v i c e
D e . . c e 對前兩個字母為D e,後跟兩個任一字元,最後為c e
/ ^ q 對以^ q開始行
^ . $ 對僅有一個字元的行
^/.[0-9][0-9] 對以一個句點和兩個數字開始的行
' " D e v i c e " ' 對單詞d e v i c e
D e [ V v ] i c e / . 對單詞D e v i c e或d e v i c e
[ 0 - 9 ] / { 2 / } - [ 0 - 9 ] / { 2 / } - [ 0 - 9 ] / { 4 / } 對日期格式d d - m m - y y y y
[ 0 - 9 ] / { 3 / } / . [ 0 - 9 ] / { 3 / } / . [ 0 - 9 ] / { 3 / } / . [ 0 - 9 ] / { 3 / } 對I P地址格式nnn. nnn.nnn.nnn
[ ^ . * $ ] 對匹配任意行

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.