总结:
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哈
阅读(787) | 评论(0) | 转发(0) |