Chinaunix首页 | 论坛 | 博客
  • 博客访问: 547288
  • 博文数量: 84
  • 博客积分: 1529
  • 博客等级: 上尉
  • 技术积分: 1472
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-27 17:57
文章分类

全部博文(84)

文章存档

2014年(7)

2013年(9)

2012年(20)

2011年(48)

分类: Python/Ruby

2011-06-09 14:57:36

总结:

hard quote:' ' ,凡在hard quote 中的所有meta均被关闭;

soft quote: " " , 在soft quote中大部分meta都会被关闭,但某些保留如($);

进行export和unset的时候会进行变量的替换;
例如:A=B; unset $A 则是取消B这个变量而不是A,做了变量替换;

所谓source就是让script在当前shell内执行、而不是产生一个sub-sell来执行;
exec也是让那个script在同一个行程上执行,但是原有行程则被结束了;

$()与``都是用来做命令替换用的;
在多层次的复合替换中,``须要额外的跳脱(\`)处理,而$()则比较直观;
$()并不是所有的shell都可以用,``则基本上所有的unix shell都可以;
${}用来做命令替换的,有很多特殊有法,${#var}可以计算变量值的长度

A="a b c def" 只是将变量$A替换为一个单一的字符串;
A=(a b c def) ;则$A为数组;
${A[@]}或者${A[*]} 可以得到全部组数
${A[0]}第一个组数
${#A[@]}或者${#A[*]}数组长度
${#A[0]}第一个数组长度

$10不替换第10个参数,而是替换第一个参数$1然后再补一个0于其后,可用${10}解决这个问题;
$@和$*如果置于soft quote中的话:
$@则可得到"p1" "p2 p3" "p4" 这三个不同的词段;而$*会将这一整串作为单一的词段;

ls my.file no.such.file 1>file.both 2>file.both若stdoutstderr都在同时写入file.both的话,则后面的将会覆盖前面的。
可采用:ls my.file no.such.file 1>file.both 2>&1 或者 ls my.file no.such.file 2>file.both >&2进行解决这个问题

set -o noclobber
echo "4" > file.out
此时会提示错误:file:cannot overwirte existing file;用set -o noclobber 防止文件被全部清空重新赋值
用set +o noclobber可以解除这个;
用 echo "4" >| file.out 可以在不解除的情况下用;

cat < file > file ;此时运行后file的文件内容将为空,因为IO Redirection 中,stdout与stderr的管道会先准备好,才会从stdin读进资料。也就是说,在上例中>file
会先将file清空,然后才读进

cat <> file 与 cat >file 疑问?

在pipe line之间,前一个命令的stderr是不会接进下一个命令的stdin的,其输出若不用2> 导到file去的话,它还是送到监视界面上来。若想stderr也喂到stdin中去,可以将stderr合并到stdout一同输出

cmd1 | cmd2 | cmd3 这段pipe line中,若要将cmd2的结果存到某一个档案中:
若写成cmd1 | cmd2 > file | cmd3的话会发现cmd3的stdin是空的,因为水管已经接到别的水池中去了
问题解决:cmd1 | cmd2 > file;cmd3 < file 这样可以解决,但是I/0会变双倍;
最OK解决方法:采用tee命令; cmd1 | cmd2 | tee file |cmd3  tee命令会在不影响I/O的情况下,将stdout复制一份到档案去,默认会更改目标档案,若要改为增加内容的话,可以用-a参数达成;

RE常见的meta字符:
anchor:用于标识RE于句子中的位置所在,常见的有:
^ :标识句首,如^abc表示以abc开首的句子;
$ :标识句尾
\< :表示词首,如\
\>:表示词尾
RE常见的修饰符(modifier):
* :表示前一个char.set的出现次数为0或多次;
? :表示前一个char.set的出现次数为0或1次;
+:表示前一个char.set的出现次数为1或多次;
{n}:前一个char.set的出现次数必定为n次;
{n,m}:前一个char.set的出现次数为n到m次
在使用modifier时,很容易忽略边界(boundary)字符的重要性;
例如:ab{3,5}这个RE可以抓到abbbbbbc字符;因为a后面接3到5个字符,但3到5个b后面的我们却没有规定是什么,同理b{3,5}c 也可以抓到abbbbbbbbbc字符

egrep为grep的扩充版:
egrep  支持?与+这两种modifier,但grep不行;
egrep  支持a|b 或者(abc|xyz),但grep不行;
grep 在处理{n,m}时需要\{与\},但egrep则不需要;
总结:能用egrep就不用grep哈
 
 
 









 

阅读(648) | 评论(0) | 转发(0) |
0

上一篇:mysql 参数client_flags

下一篇:getopts

给主人留下些什么吧!~~