高级bash编程指南(八)

一 正则表达式

1.在这里就不详细列举正则表达式中各种元字符的功能

仅仅说一下,在看这一章遇到的一个小问题

* 匹配前一个字符的任意多次(包括零次)

eg "1133*",更明确的应该写成"113(3*)"

可以理解它匹配113(0个3) 1133(1个3),但是为什么可以

匹配111312?

111312 因为它是这样匹配的此时匹配了1个3,并没有匹配

开头和结尾,要想匹配开头和结尾的话,需要改成"^1133*$" ,

此时就只能匹配以113开头,且后面有n(n>=0)个3的情况。

二 通配

下面介绍另一概念:通配。这是一个很容易跟正则表达式混淆的概念。

Bash本省没有正则表达式的功能,在脚本里,使用正则表达式的是命令和软件包。

eg sed,grep和awk,他们可以解释正则表达式。

Bash所做的时展开文件名扩展---这就是所谓的通配(globbing)--单它不是使用标准的

正则表达式。而是使用通配符。通配解释标准的通配符*和?,方括号括起来的字符,

还有其他的一些特殊的字符(eg用^表示反匹配;然而^在正则表达式中匹配一行的开始。

同时注意在正则表达式中[^b-d]和^[b-d]的区别,前者表示匹配b,c,d之外的字符,后者表示

以b,c,d开头的)。然而匹配机制的通配符有很大的局限性。包含有*号的字符串将不会匹配

以点卡头的文件。

三 subshell

1.外部命令能生成一个子进程,然而内建命令却不,因此内建明亮比外部命令执行效率高。

2.(command1,command2,..)嵌在圆括号里的一列命令在一个子shell中运行,在子shell

里与你性能该的变量不能被这段子shell代码块之外的脚本访问。只有export某些变量后,

该子shell的子进程中才能访问。在{...}中运行的命令不会产生一个子shell,在其中运行。

3.eg.

#!/bin/bash

show()

{var=100}

(var1=200)

echo $va $var1  #result  100 null

四 进程替换

1.进程替换与命令很相似。命令替换把一个命令的结果赋给一个变量。

eg,var=`ls -l` or var=$(ls -l),进程替换是把一个进程的输出回馈给另一进程,

即把一个命令的结果发送给另一命令,有点管道的意思。

<(command),>(command)

值得注意的是<,>和(之间没有空格。

posted @ 2011-03-19 15:26  xdzone  Views(377)  Comments(0Edit  收藏  举报