|
SHELL复习摘要(三)
扩展性样式比对
shell于egrep/awk正则表达式运算符比较
ksh/bash egrep/awk 含义
*(exp) exp* 存在0个或多个exp
+(exp) exp+ 存在1个或多个exp
?(exp) exp? 存在0个或1个exp
@(exp1|exp2|…) exp1|exp2|… exp1或exp2
!(exp) (none) 所有不相符于exp的
例如:
@(dave|fred|bob)比对相符的有dave、fred、bob
*(dave|fred|bob)意即存在0或多个dave等
+(dave|fred|bob)相符于上述所有字符串,null除外
?(dave|fred|bob)相符于null字符串,dave等
!(dave|fred|bob)相符于dave、fred、bob之外的任何字符串
egrep和awk有两个正则表达式运算符在shell里没有等同物:
行开否与行结束运算符^和$。
单词的起始与单词的结束运算符\
括弧展开
括弧展开式让输入更轻松的方法
echo cpp-{args,l{e,o}x,parse}.c
cpp-args.c cpp-lex.c cpp-lox.c cpp-parse.c
进程替换
进程替换可以让用户开启多个进程数据流,再将它们喂给单一程序处理。
例如:
awk ‘…’ (grep “USER”|wc -l)>/dev/null
进程替换只有在支持/dev/fd/n特殊文件的UNIX系统下可使用,为命名访问到已开启之文件描述代码。
各类扩展
附加的波浪号展开:POSIX将~定义为$HOME与~user—user家目录。bash和ksh允许使用~+作为$PWD(当前工作目录)的缩写,使用~-作为$OLDPWD(前一个工作目录)的缩写。
算术命令:POSIX定义$((…))标记作为算术展开,但不提供任何其他算术操作限制。不过两种shell都支持两种直接处理算术的标记,而非展开:
let “x = 5+y” let命令,需以引号框起
((x = 5+y)) 未前置$,自动的用双括号引起来
x=$((5+y)) 类似,但=前后都不可置放任何空格
有个不同之处,便是let与((…))都有离开状态:0为真(true)值,而1为伪(false)值。
case语句的可选用圆括号比对:命令替换的$(…)语法已由POSIX标准化。case开启圆括号必须置于$(…)内。
some command $(…
case $var in
( foo|bar ) some other command ;;
( stuff|junk ) something else agin ;;
esac
…)
使用 |
|
|