手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

请教哪儿有写unix

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

    通常Shell程式将在子Shell中执行,该程式对变量的改变只在子Shell中有效而在当前Shell中无效。"."命令能够使Shell程式在当前Shell中执行。用户能够在当前Shell中定义函数和对变量赋值。通常用下面命令来重新初使化.profile对Shell环境的配置。
    $ . .profile
  由于看到这部分相对简单,我们还是顺便说说trap好了

使用trap命令进行例外处理

  用户编写程式在程式运行时可能会发生一些例外情况,比如执行该程式的用户按中断键或使用kill命令,或控制终端突然和系统断开等。unix系统中的上述情况会使系统向进程发一个信号,通常情况下该信号使进程终止运行。有时侯用户希望进程在接到终止信号时进行一些特别的操作。若进程在运行时产生一些临时文档,又因接受到的信号而终止。那么该进程产生的临时文档将保留下来。在bsh中,用户能够使用trap命令修改进程接收到终止信号时进行的默认操作。
  trap命令格式如下:

     trap command_string signals


多数系统中共有15种发给进程的信号,默认情况下大多数信号都会使程式终止。用户最好查阅自己系统的文挡,看看本系统内使用的信号种类。除了信号为9(真正的kill信号)不能使用trap命令外,其他信号所带来的操作都能够用trap命令进行指定。下面是trap命令中经常使用的几种信号:

    信号   功能
    
     1     挂起
     2    操作中断
     15    软终止(kill信号)

  若命令串中包含不只一条命令,必须使用引号将整个命令括起来,具体是单引号还是双引号,由用户是否需要变量替换决定。" "替换,' '不替换。

  使用下面trap命令能够使程式在接收到挂起、中断或kill信号时,首先把临时文档删除,然后退出:

    trap "rm $TEMPDIR/* $$;exit" 1 2 15

  在上面例子中,当Shell读取trap命令时,首先对$TEMPDIR和$$进行变量替换,替换之后的命令串将被保存在trap表中,若上例中trap命令使用单引号时,trap命令执行时候,不进行变量替换,而把命令串 rm $TEMPDIR/* $$;exit 放到trap表中,当检测到信号时,程式解释执行trap表中的命令串,此时进行变量替换。前面变量$TEMPDIR和$$的值为执行trap指令时候的值,后一种情况中变量的值为程式接收到信号时候的值,所以 "、'一定要区分仔细。

  下面命令的含义为用户按二次中断键后,程式才终止:

    trap 'trap 2' 2

  一般trap命令中的命令串中几乎都包含exit语句,上面rm的例子若无exit语句,接收到信号rm命令执行完后程式将挂起。但有时用户也需要程式在接到信号后挂起,例如当终端和系统断开后,用户发出挂起信号,并执行空命令,如下:

    trap : 1

  若用户想取消前trap指令配置的命令串,能够再执行trap命令,在命令中不指定命令串表示接收到信号后进行默认的操作,命令如下:
    trap 1

规范Shell

获取UNIX类型的选项:

  unix有一个长处就是标准UNIX命令在执行时都具备相同的命令行格式:

  command -options parameters

  假如在执行Shell程式也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。该语句的格式为:

  getopts option_string variable

  其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么他将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程式中能够利用getopts的返回值建立一个循环。

  下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程式除了完成unix的标准命令date的功能外,还增加了许多新的选项。
  #新date程式
  if [ $# -lt 1 ]
  then
    date
  else
    while getopts mdyDHMSTJjwahr OPTION
    do
      case $OPTION
      in
        m)date ' %m';;
        d)date ' %d';;
        y)date ' %y';;
        D)date ' %D';;
        H0date ' %H';;
        M)date ' %M';;
        S)date ' %S';;
        T)date ' %T';;
        j)date ' %j';;
        J)date ' %y%j';;
        w)date ' %w';;
        a)date ' %a';;
        h)date ' %h';;
        r)date ' %r';;
        \?)echo "无效的选项!$OPTION";;
      esac
    done
  fi

有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特别的变量OPTARG中。假如该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。

  下面的例子,实现拷贝一个文档,并给文档赋一个新的名字。-c选项指定程式拷贝的次数,-v选项需要显示新创建文档的文档名。

  #--拷贝程式

  COPIES=1
  VERBOSE=N
  while getopts vc:OPTION
  do
    case $OPTION
    in
      c)COPIES=$OPTARG;;
      v)VERBOSE=Y;;
      \?)echo "无效参数!"
        exit 1;;
    esac
  done
  if [ $OPTIND -gt $# ]
  then
    echo "No file name specified"
     exit 2
  fi
  shift 'expr $OPTIND - 1'
  FILE=$1
  COPY=0
  while [ $COPIES -gt $COPY ]
  do
    COPY='expr $COPY 1'
    cp $FILE $ {FILE} $ {COPY}
    if [ VERBOSE = Y }
    then
      echo ${FILE} $ {COPY}
    fi
  done

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!