1.基本unix/
       
        Linux
       
       命令
      
     
    
    
    
     (1) setuid,guid
    
    
    
     作用: suid意味着如果某个用户对属于自己的shell脚本设置了这种权限,
    
    
    
     那么其他用户在执行这一脚本时也会具有其属主的相应权限。
    
    
    
     guid执行相应脚本的用户将具有该文件所属用户组中用户的权限
    
    
    
     例:chmod 4755
    
   
    (2) chmod,chown,chgrp
    
    作用:修改权限
    
    格式:chmod [who] operator [permission] filename
    
    who:u(文件属主) g(同组用户) o(其他用户) a(所有用户)
    
    operator: +(增加权限) -(取消权限) =(设定权限)
    
    permission:r(读) w(写) x(执行) s(文件属主和组set-ID) t(粘性位*) l(给文件加锁,使其他用户无法访问)
    
    例:chmod ugo+rwx myfile 将myfile文件给u,g,o用户r,w,x的权限
   
    (3) umask
    
    作用:设置所创建文件/目录的缺省权限
    
    格式:umask [value]
    
    例: umask 022
    
    touch file1
    
    则file1的权限部分变为:-rw-r–r–
    
    (4) ln
    
    格式:ln [-s] source_path target_path
   
    (5) touch
    
    作用:创建一个空文档
    
    格式:tough myfile
    
    注解:tough myfile将创建一个文件myfile
   
    (6) find
    
    作用:搜索文件
    
    格式:find pathname -options [-print -exec -ok]
    
    -print:find命令将匹配的文件输出到标准输出
    
    -exec:find命令对匹配的文件执行该参数所给出的shell命令,相应命令的格式为’command'{} /;
    
    -ok:作用和-exec作用相同。只不过每一步执行都需要用户的确认
    -options:(主要的)
    
    -name:按文件名查找
    
    -perm:按文件权限查找
    
    -prune:使find命令不在当前指定的目录中查找
    
    -user:按照文件属主查找
    
    -group:按照文件所属组来查找
    
    -mtime -n +n,按照文件的更改时间来查找,-n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前;此外,还有-atime,-ctime选项,和-mtime选项类似
    
    -type:查找某一类型的文件,诸如:b(块设备文件),d(目录),c(字符设备文件),p(管道文件),l(符号链接文件),f(普通文件)
    
    -size n[c]:查找文件长度为n块的文件
    
    例:
    
    在当前目录及其子目录中查找所有的”*.txt”文件
    
    find . -name “*.txt” -print
    
    在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
    
    find . -perm 755 -print
    
    在当前目录下查找除目录以外的所有类型的文件
    
    find . ! -type d -print
    
    用ls -l 命令列出所匹配的文件
    
    find . -type f -exec ls -l {} /;
    
    在/logs目录中查找更改时间在5日以前的文件并删除它们
    
    find logs -type f -mtime +5 -exec rm {} /;
    
    (7)echo
    
    作用:显示文本行或变量,或者把字符串输入到文件
    
    格式:echo string
    
    例:
    
    给出提示符,并输入值给变量name
    
    echo “What’s your name:/c”
    
    read name
   
    (8)pg
    
    作用:显示文件
    
    格式:pg filename
   
    (9)read
    
    作用:读入值给变量
    
    格式:read var
    
    例: read name 从键盘读入字符到name变量
    
    (10)cat
    
    作用:显示文件
    
    格式:cat filename
   
    (11)tee
    
    作用:把输出的一个副本输送到标准输出,另一个副本拷贝到相应的文件中
    
    格式:tee filename
    
    例:who | tee who.out 使用who命令,结果输出到屏幕上,同时保存在who.out文件中
   
    (12)grep(全局正则表达式)
    
    作用:允许对文本文件进行模式查找,如果找到匹配模式,grep打印包含模式的所有行
    
    格式: grep [options] 基本正则表达式  [文件]
    
    常用options值:
    
    -c 只输出匹配行的计数
    
    -i 不区分大小写(只适用于单字符)
    
    -h 查询多文件时不显示文件名
    
    -l 查询多文件时只输出包含匹配字符的文件名
    
    -n 显示匹配行及行号
    
    -s 不显示不存在或无匹配文本的错误信息
    
    -v 显示不包含匹配文本的所有行
    
    例:grep “sort” *.doc 在当前目录下所有的.doc文件中查找字符串”sort”
    
    grep “48<tab>” data.f 抽取字符串后有一个<Tab>键
    
    grep ‘[0-9]/{3/}/.[0-0/[3/}/.’ ipfile 要抽取其中所有nnn.nnn的IP地址(原文印刷错误?)
   
    (13)awk
    
    格式: awk [-f field-separator] ‘command’ input-file(s)
    
    =====================================================================================
    
    awk条件操作符
    
    =====================================================================================
    
    操作符  描述          操作符  描述
    
    <         小于          >=       大于等于
    
    <=       小于等于    ~         匹配正则表达式
    
    ==       等于          !          不匹配正则表达式
    
    !=       不等于
    
    =====================================================================================
   
    awk内置变量
    
    ——————————————————
    
    ARGC  命令行参数个数
    
    ARGV  命令行参数排列
    
    ENVIRON  支持队列中系统环境变量的使用
    
    FILENAME awk浏览的文件名
    
    FNR  浏览文件的记录数
    
    FS  设置输入域分隔符,等价于命令行-F选项
    
    NF  浏览记录的域个数
    
    NR  已读的记录数
    
    OFS  输出域分隔符
    
    ORS  输出记录分隔符
    
    RS  控制记录分隔符
   
注:awk中所采用的正则表达式的符号要比grep和sed多两个:+(匹配一个或多个字符),?(匹配模式出现率)
    
    例:
    
    awk ‘{if($4~/Brown/) print $0}’ grade.txt 如果field-4包含了Brwon,打印该行
    
    awk ‘$3 == “48” {print $0}’ grade.txt   精确匹配,如果field-3等于了 “48”,则打印该行
    
    awk ‘{if( $1==”p1″ && $4==”p2″ ) print $0}’ grade.txt 同时满足两个条件,则打印该行
    
    awk ‘{if( $1==”p1″ || $4==”p2″ ) print $0}’ grade.txt 只要满足其中一个条件,则打印该行
   
    
    (14)expr 用于计算或数值
    
     测试
    
    
    格式:expr argument operator argument
    
    例: expr 10 + 10 其结果为20
    
    expr 30 / 3 其结果为10
    
    expr 30 /* 3 其结果为90,使用乘号时,必须用反斜线屏蔽其特定含义。
    
    expr rr + 1  当rr非整数时,将返回错误,此处为”expr:non-numeric argument”
   
    
    
     
      
       2.文件名的匹配
      
     
    
   
    
     
     
     
    
    特殊的匹配符号:
    
    * 匹配文件名中的任何字符串,包括空字符串
    
    ? 匹配文件名中的任何单个字符串
    
    […] 匹配[]中包含的任何字符
    
    [!…] 匹配[]中非感吧号!之后的字符
   
    例:
    
    显示所有以.doc结尾的文件名
    
    ls *.doc
    
    显示以cl开头,后面跟任何字符串,最后以.sed结尾的文件名
    
    ls cl*.sed
    
    显示任意两个字符开头,接着是r,后面跟任何字符的文件
    
    ls ??r*
    
    显示以i或o开头的文件名
    
    ls [io]*
    
    匹配所有以log.开头,后面跟随一个数字,然后可以是任意字符串的文件名
    
    ls log.[0-9]*
    
    匹配所有以log.开头,使用[!0-9]来表示非数字开头的字符串
    
    ls log.[0-9]*
   
    
     
      
       3.文本过滤
      
     
    
   
    
     
     
     
    
    =====================================================================================
    
    基本元字符集及其含义
    
    =====================================================================================
    
    ^                       只匹配行首
    
    $                       只匹配行尾
    
    *                       一个单字符后紧跟*,匹配0个或多个此单字符
    
    []                       匹配[]内字符。可以是一个单字符,也可以是字符序列,用-表示范围
    
    如用[1-5]代替[12345]
    
    /                        用来屏蔽一个元字符的特殊含义。如$ . ‘ ” * ^ | ( ) / + ?
   
    .                         匹配任意单字符
    
    pattern/{n/}      用来匹配前面pattern出现次数。n为次数
    
    pattern/{n,/}m  含义同上,但次数最少为n
    
    pattern/{n,m/}  含义同上,但pattern出现次数在n与m之间
    
    =====================================================================================
   
    例:
    
    ^$ 匹配一个空行
    
    ^.$ 匹配只包含一个字符的行
    
    compu*t 匹配字符u 0次或多次,这个可匹配computer,
    
    A/{2/}B 匹配字母A出现两次,并以B结尾
    
    A/{2,4/}B 匹配字母A出现2到4次之间
   
    
    
     
      
       
        4.特定shell变量
       
      
     
    
   
    
     
     
     
    
    =====================================================================================
    
    $# 传递到脚本的参数个数
    
    $* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个
    
    $$ 脚本运行的当前进程ID号
    
    $! 后台运行的最后一个进程的进程ID号
    
    $@ 与$#相同,但是使用时加引号,并在引号中返回每个参数
    
    $- 显示shell使用的当前选项,与set命令功能相同
    
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
    
    =====================================================================================
    
    其他:$0(脚本名字) $1 $2 $3 …$9
   
    
    
     
      
       5.shell输入与输出
      
     
    
   
    
     
     
    
   
    
     
      5.1文件描述符
     
    
   
    
     
      =====================================================================================
     
     
    
    文件描述符  文件
    
    0               输入文件——标准输入
    
    1               输出文件——标准输出
    
    2               错误输出文件——标准错误
   
    
     
      =====================================================================================
     
    
    
    注: 标准输入是文件描述符0,它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出
    
    标准输出是文件描述符1,它是命令的输出,缺省是屏幕,也可以是文件
    
    标准错误是文件描述符2,它是命令错误的输出,缺省是屏幕,也可以是文件
   
    
    
     
      5.2
     
     
      重定向
     
    
    :<,<<,>,>>
    
    =====================================================================================
    
    command>filename  把标准输出重定向到一个新文件中
    
    command>>filename  把标准输出重定向到一个文件中(追加)
    
    command 1>filename  把标准输出重定向到一个新文件中
    
    command>filename 2>&1  把标准输出和标准错误一起重定向到一个文件中
    
    command 2>filename  把标准错误重定向到一个新文件中
    
    command 2>>filename  把标准错误重定向到一个文件中(追加)
    
    command >>filename 2>&1  把标准输出和标准错误一起重定向到一个文件中(追加)
    
    command <filename >filename 2 command命令以filename文件作为标准输入,以filename2文件作为标准输出
    
    command <&m   把文件描述符m作为标准输入
    
    command >&m   把标准输出重定向到文件描述符m中
    
    command <&-   关闭标准输入
   
=====================================================================================
    例:
    
    #############################################################################
    
    #! /bin/sh
    
    # f_desc
    
    #把文件描述符4指定为标准输入,然后打开stock.txt文件
    
    exec 4<&0 0<stock.txt
   
    #读入2行文本
    
    read line1
    
    read line2
   
    #作为标准输入的文件描述符4被关闭
    
    exec 0<&4
   
    #显示两个变量的内容
    
    echo &line1
    
    echo &line2
    
    #############################################################################
   
    
    
     
      5.3管道
     
    
    : 命令1|命令2
    
    who | awk ‘{print $1″/t”$2}’
   
    
     
      
       6.条件测试
      
     
    
   
    格式1:test condition
    
    格式2:[condition]
   
    =====================================================================================
    
    文件测试状态
    
    =====================================================================================
    
    -d 目录        -s 文件长度大于0,非空
    
    -f 正规文件   -w 可写
    
    -l 符号链接   -u 文件有suid位设置
    
    -r 可读         -x 可执行
    
    =====================================================================================
    
    
     组合测试: -a 逻辑与 -o逻辑或 !逻辑否
    
   
    例:  [-w results.txt -a -w scores.txt
    
    echo $?
    
    检查上面两个文件是不是都是可写的
   
    
     字符串测试 string_operator 可为=(相等)  !=(不相等)  -z(空串) -n(非空串)
    
   
    
    格式1:test “string”
    
    格式2:test string_operator “string”
    
    格式3:test “string” string_operator “string”
    
    格式4:[string_operator string]
    
    格式5:[string string_operator string]
   
    
    
     数值测试 numeric_operator可为 -eq(相等),-ne(不相等),-gt(大于),-lt(小于),-le(小于等于),-ge(大于等于)
     
    
    格式1:”number” numeric_operator “number”
    
    格式2:[“number” numeric_operator “number”]
   
    
     
      
     
    
    
     
      
       7.命令执行顺序 && ,||, (), {}
      
     
     
    
   
    
     &&
     
    
    格式:命令1 && 命令2
    
    说明:命令1返回真(即返回0,成功被执行)后,命令2才能够被执行
    
    例:/apps/bin目录将会被移到/apps/dev/bin目录下,如果它没有被成功的执行,就不会删除/apps/bin目录
    
    mv /apps/bin /apps/dev/bin && rm -r /apps/bin
   
    
     ||
    
    
    格式:命令1 || 命令2
    
    说明:命令1未执行成功,那么就执行命令2
    
    例: 拷贝文件没成功的话,就显示错误.
    
    cp word.txt word.bak || echo “cp file failed!”
   
    
     () {}
     
    
    格式:(命令1;命令2;…) {命令1;命令2;…}
    
   
    
    
     
      
       8.控制流结构
      
     
     if…then…else…fi,case,for,until,while,break,continue
    
   
    
     1)返回码
     
    
    观察:echo $?
    
    退出:exit n (n为一数字)
    
    break n  ==>跳出指定的循环个数。如break 2则跳出2个循环
    
    continue ==>跳出循环当前步
   
    
    
     2)流控制if…then…else…fi
    
   
    if condition1
    
    then
    
    command1
    
    elif condition2
    
    then
    
    command2
    
    else
    
    command3
    
    fi
   
    
    
     例1:
     
    
   
   
   
    
     例2:
     
    
   
   
   
    
     例3:
    
    
   
   
   
    
    
     例4:
    
    
   
   
   
    
    
     3)case控制流
     
    
    case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。
    
    格式:
    
    ==========================================================================
    
    case 值 in
    
    模式1)
    
    命令1
    
    ….
    
    ;;
    
    模式2)
    
    命令2
    
    ….
    
    ;;
    
    esac
    
    ==========================================================================
    
    注:每一模式必须以右括号结束,取值可以为变量或常数。
    
    匹配发现取值符合某一模式后,其间所有命令开始执行直至“;;”
   
    取值将检测匹配每一个模式,一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。
    
    如果无一匹配模式,使用星号*捕获该值,再接受其他输入
    模式部分可能包括元字符,与在命令行文件扩展名例子中使用过的匹配模式类型相同,即
    
    *(任意字符),?(任意单字符),[..](类或范围中任意字符)
   
    例1:
    
   
   
   
    
    例2:
    
    ##############################################
    
    #! /bin/sh
    
    # caseparam
    
    if [ $# !=1 ] ; then
    
    echo “Usage:`basename $0` [start|stop|help]” >&2
    
    exit 1
    
    fi
    
    #assign the parameter to the variable OPT
    
    OPT=$1
    
    case $OPT in
    
    start) echo “starting..`basename $0`”
    
    ;;
    
    stop) echo “stopping..`basename $0`”
    
    ;;
    
    help)
    
    ;;
    
    *) echo “Usage:`basename $0` [start|stop|help]”
    
    ;;
    
    esac
    
    ##############################################
   
    
    
     4)循环
     
     for格式
    
    
    ==========================================================================
    
    for 变量名 in 列表
    
    do
    
    命令1
    
    命令2
    
    …..
    
    命令n
    
    done
    
    ==========================================================================
    
    注:列表可以包含替换,字符串和文件名
   
    例1:
    
    ##############################################
    
    #! /bin/sh
    
    # for_i
    
    for loop in 1 2 3 4 5  #for loop in “orange red blue grey”
    
    do
    
    echo $loop
    
    done
    
    ##############################################
   
    例2:
    
    ##############################################
    
    #! /bin/sh
    
    # for_ls
    
    for loop in `ls `
    
    do
    
    echo $loop
    
    done
    
    ##############################################
   
    例3:
    
    #for params,不使用in列表选项时,实际上等价于
    
    #for params in “$@” 或
    
    #for params in “$*”
    
    ##############################################
    
    #! /bin/sh
    
    # for_param
    
    for loop in “$@” # 也可以是”$*,” 这可以从命令行中取得参数
   
    do
    
    echo $loop
    
    done
    
    ##############################################
   
    
    
     until(不常用)格式
    
    
    ==========================================================================
    
    until 条件
    
    do
    
    命令1
    
    命令2
    
    …..
    
    命令n
    
    done
    
    ==========================================================================
    
    例1:监视文件系统容量,当它达到一定水平时通知超级用户
    
    ##############################################
    
    #! /bin/sh
    
    # until_mon
    
    LOOK_OUT=`df | grep /logs | awk ‘{print $5}’ | sed ‘s/%//g’`
    
    echo $LOOK_OUT
    
    until [“$LOOK_OUT” -gt “90” ]
    
    do
    
    echo “Filesystem..logs is nearly full” | mail root
    
    exit 0
    
    done
    
    ##############################################
   
    
    
     while格式
    
    
    ==========================================================================
    
    while 命令
    
    do
    
    命令1
    
    命令2
    
    …..
    
    命令n
    
    done
    
    ==========================================================================
   
    例1:从文件中读取数据,使用重定向以保证从文件中读取数据
    
    #########################################################################
    
    #! /bin/sh  | SAVEDIFS=$IFS
    
    # whileread  | IFS=:
    
    while read LINE  | while read NAME DEPT ID
    
    do    | do
    
    echo $LINE  |     echo -e “$NAME/t $DEPT/t $ID”
    
    done <names.txt  | done <names.txt
    
    | IFS=$SAVEDIFS
    
    #########################################################################
   
    上面右边使用IFS将域分隔符改为;号而不是空格或tab键
    
    测试数据names.txt:
    
    Louise Conrad:Accounts:Acc889
    
    Peter James:Payroll:PR483
    
    #########################################################################
   
    
    
   
    
     死循环格式
    
    
    while :
    
    do
    
    命令
    
    done
   
    例2:
    
    #########################################################################
    
    #! /bin/sh
    
    # menu
    
    #set the date,user and hostname up
    
    MYDATE=`date +%d/%m/%Y`
    
    THIS_HOST=`hostname -s`
    
    USER=`whoami`
    
    #loop forever !
    
    while :
    
    do
    
    # clear the screen
    
    tput clear
    
    # here documents starts here
    
    cat <<MAYDAY
    
    —————————————————————————
    
    User:$USER  Host:$THIS_HOST  Date:$MYDATE
    
    —————————————————————————
    
    1 : List files in current directory
    
    2 : Use the vi editor
    
    3 : See who is on the system
    
    H : Help screen
    
    Q : Exit Menu
    
    —————————————————————————
    
    MADAY
   
    # here document finished
    
    echo -e “/tYour Choice [1,2,3,H,Q] >”
    
    read CHOICE
    
    case $CHOICE in
    
    1) ls
    
    ;;
    
    2) vi
    
    ;;
    
    3) who
    
    ;;
    
    H|h)
    
    cat <<MAYDAY
    
    this is the help screen,nothing here yet to help you !
    
    MAYDAY
    
    ;;
    
    Q|q) exit 0
    
    ;;
    
    *) echo -e “/t/007Unknown user response”
    
    ;;
    
    esac
    
    echo -e -n “/tHit the return key to continue”
    
    read DUMMY
    
    done
    
    #########################################################################
   
 
