蓝鸟开发:shell复习摘要(三)

来源:百度文库 编辑:偶看新闻 时间:2024/05/01 09:33:00
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 ‘…’ <(generate_data) <(generate_more_data)

进程替换也可用于输出,特别是配合tee使用。

cat generate_data |tee >(sort | uniq |wc -l) >(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

…)

使用<<<的即席字符串:以echo产生单行输入供进一步处理,是相当常见的用法。

例:echo $myvar1 $myvar2 |tr …|…

即席字符串使用<<<再接上字符串。字符串即成为相关联命令的标准输入,辅以shell自动提供最后的换行符号:

tr … <<< “$myvar1 $myvar2”|…

扩展性字符串标记:此标记包括在单引号框起的字符串,前置一个$。这类字符串的行为模式像一般单引号框起来的字符串,不过shell会解释字符串里的转义符。

echo $’A\tB’

A     B

EXPECT交互

#!/usr/bin/expect

set timeout 30

spawn ssh nxuser@192.168.3.12

expect "password:"

send "Scctwap#2010\r"

expect "#"

send "df -h\r"

expect eof

interact

算术计算

let、bc、dc、expr、echo和awk

let “t2=((a=1,15/3))”#set a=1,t2=5

逗号链接了一系列的算术操作,虽然里边所有的内容都被运行了,但只有最后一项被

返回

bc是一个交互式计算器,通过管道可以不交互

# echo "(6+3)*2" |bc

18

# echo 15/4 |bc

3

# echo "scale=2;15/4" |bc

3.75

# echo "3+4;5*2;5^2;18/4" |bc

7

10

25

4

dc是比bc更复杂的交互式计算器,他是压栈操作。

# dc

3

2+

p

5

4*

p

20

quit

 

# echo 3 2+ 4* p |dc

20

expr不光可以计算加减乘除,还有表达式。需要空格和转义符号

# expr length "yangzhigang.cublog.cn"

21

#expr 3 + 2

5

echo可以简单计算

#echo $(((2+3)*2))

10

Awk也可以进行简单计算

#awk ‘BEGIN{a=2+3;print a}’

5

bash脚本安全开场白

IFS=$’ \t\n’

unset –f unalias

unset –f command

SYSPATH=”$(command –p getconf PATH 2>/dev/null)”

if [[ -z “$SYSPATH” ]];then

      SYSPATH=”/usr/bin:/bin”

fi

PATH=”$SYSPATH:$PATH”

:空命令

空命令,等价于"NOP"(no op,一个什么也不干的命令).也可以被认为与shell 的内建命令(true)作用相同.":"命令是一个bash 的内建命令,它的返回值为0,就是shell 返回的true.

在一个2 元命令中提供一个占位符,具体见Example 8-2,和"默认参数".如:

1 : ${username=`whoami`}

2 # ${username=`whoami`} 如果没有":"的话,将给出一个错误,除非"username"是

3 # 个命令

使用"参数替换"来评估字符串变量.如:

1 : ${HOSTNAME?} ${USER?} ${MAIL?}

2 # 如果一个或多个必要的环境变量没被设置的话,

3 #+ 就打印错误信息.

"变量扩展/子串替换"

在和> (重定向操作符)结合使用时,把一个文件截断到0 长度,没有修改它的权限.

如果文件在之前并不存在,那么就创建它.如:

1 : > data.xxx #文件"data.xxx"现在被清空了.

2

3 #与 cat /dev/null >data.xxx 的作用相同

4 #然而,这不会产生一个新的进程,因为":"是一个内建命令.

在和>>重定向操作符结合使用时,将不会对想要附加的文件产生任何影响.

如果文件不存在,将创建.

注意: 这只适用于正规文件,而不是管道,符号连接,和某些特殊文件.

:应用技巧,可以产生自文档化脚本

   1 #!/bin/bash

   2 # self-document.sh: 自文档化(self-documenting)的脚本

   3 # Modification of "colm.sh".

   4

   5 DOC_REQUEST=70

   6

   7 if [ "$1" = "-h"  -o "$1" = "--help" ]     # 请求帮助.

   8 then

   9   echo; echo "Usage: $0 [directory-name]"; echo

  10   sed -n -e '/DOCUMENTATIONXX$/,/^DOCUMENTATIONXX$/p' "$0" |

  11   sed -e '/DOCUMENTATIONXX$/d'; exit $DOC_REQUEST; fi

  12

  13

  14 : <

  15 List the statistics of a specified directory in tabular format.

  16 ---------------------------------------------------------------

  17 The command line parameter gives the directory to be listed.

  18 If no directory specified or directory specified cannot be read,

  19 then list the current working directory.

  20

  21 DOCUMENTATIONXX

  22

  23 if [ -z "$1" -o ! -r "$1" ]

  24 then

  25   directory=.

  26 else

  27   directory="$1"

  28 fi 

  29

  30 echo "Listing of "$directory":"; echo

  31 (printf "PERMISSIONS LINKS OWNER GROUP SIZE MONTH DAY HH:MM PROG-NAME\n" \

  32 ; ls -l "$directory" | sed 1d) | column -t

  33

  34 exit 0

双括号结构

使用双括号后可以使用C风格的变量操作的一种机制。

((a++)) #C风格的计算后自加

((++a)) #C风格的计算前自加

((t=a<10?7:11)) #C风格的三元计算,如果a小于10,则t等于7,否则t等于11

本文出自 “摸索Linux” 博客,请务必保留此出处http://www.uplook.cn/?a=index&m=index&c=iframe&url=http%3A%2F%2Fasram.blog.51cto.com%2F1442164%2F440913