linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > article > unix > unix提高 >
栏目导栏
资料搜索
热门文章
·20%的SOLARIS知识解决80%的问题
·Solaris启动过程详解 zt
·查看Solaris系统硬件配置的命令
·Unix系列shell程序编写(中)
·STRUTS 源码学习笔记
·SOLARIS技巧篇
·snort源码分析
·Unix系列shell程序编写(下)
·在solaris 10/x86下安装oracle
·solaris 10 硬盘安装
·Solaris安全配置手册
·Apache源代码分析——关于模块
·HP-UX基本指令快速参考
· Tomcat Server源码启动分析
·Solaris8 双网卡配置(路由器用
最新文章
·solaris系统安全配置
·RHEL5.0操作系统下NFS服务的配
·Solaris Linux 9下Vsftpd的配置
·在HP-UX下建立只归属于某个目录
·SolarWinds2002使用说明
·从外部存储划盘并加入vg,为fs扩
·因带库问题导致系统光纤卡报错
·Unix下多线程中条件变量的使用
·UNIX和Linux中信号的个数
·不同的类UNIX操作系统密码破解
·AIX系统下Domino邮件服务器安装
·限制ROOT用户远程登陆UNIX系统
·Unix操作系统入侵追踪反击战
·AIX CDE不能启动的故障一般性解
·CentOS4.4用VSFTPD架设FTP服务
Google
 
Unix系列shell程序编写(下)
[ 作者:Linux联盟收集  加入时间:2006-06-24 16:28:02  来自:Linux联盟收集 ]
   7XvLinux联盟
QUOTE:
trap command_string signals
7XvLinux联盟
多数系统中共有15种发给进程的信号,默认情况下大多数信号都会使程序终止。用户最好查阅自己系统的文挡,看看本系统内使用的信号种类。除了信号为9(真正的kill信号)不能使用trap命令外,其他信号所带来的操作都可以用trap命令进行指定。下面是trap命令中经常使用的几种信号: 7XvLinux联盟
7XvLinux联盟
    信号   功能 7XvLinux联盟
     7XvLinux联盟
     1     挂起 7XvLinux联盟
     2    操作中断 7XvLinux联盟
     15    软终止(kill信号) 7XvLinux联盟
7XvLinux联盟
  若命令串中包含不只一条命令,必须使用引号将整个命令括起来,具体是单引号还是双引号,由用户是否需要变量替换决定。" "替换,' '不替换。 7XvLinux联盟
7XvLinux联盟
  使用下面trap命令可以使程序在接收到挂起、中断或kill信号时,首先把临时文件删除,然后退出: 7XvLinux联盟
7XvLinux联盟
    trap "rm $TEMPDIR/* $$;exit" 1 2 15 7XvLinux联盟
7XvLinux联盟
  在上面例子中,当Shell读取trap命令时,首先对$TEMPDIR和$$进行变量替换,替换之后的命令串将被保存在trap表中,若上例中trap命令使用单引号时,trap命令执行时候,不进行变量替换,而把命令串 rm $TEMPDIR/* $$;exit 放到trap表中,当检测到信号时,程序解释执行trap表中的命令串,此时进行变量替换。前面变量$TEMPDIR和$$的值为执行trap指令时候的值,后一种情况中变量的值为程序接收到信号时候的值,所以 "、'一定要区分仔细。 7XvLinux联盟
7XvLinux联盟
  下面命令的含义为用户按二次中断键后,程序才终止: 7XvLinux联盟
7XvLinux联盟
    trap 'trap 2' 2 7XvLinux联盟
7XvLinux联盟
  一般trap命令中的命令串中几乎都包含exit语句,上面rm的例子若无exit语句,接收到信号rm命令执行完后程序将挂起。但有时用户也需要程序在接到信号后挂起,例如当终端和系统断开后,用户发出挂起信号,并执行空命令,如下: 7XvLinux联盟
7XvLinux联盟
    trap : 1 7XvLinux联盟
7XvLinux联盟
  若用户想取消前trap指令设置的命令串,可以再执行trap命令,在命令中不指定命令串表示接收到信号后进行默认的操作,命令如下: 7XvLinux联盟
    trap 1 7XvLinux联盟
7XvLinux联盟
规范Shell 7XvLinux联盟
7XvLinux联盟
获取UNIX类型的选项: 7XvLinux联盟
7XvLinux联盟
  unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式: 7XvLinux联盟
7XvLinux联盟
  command -options parameters 7XvLinux联盟
7XvLinux联盟
  如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。该语句的格式为: 7XvLinux联盟
7XvLinux联盟
  getopts option_string variable 7XvLinux联盟
7XvLinux联盟
  其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。 7XvLinux联盟
7XvLinux联盟
  下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。 7XvLinux联盟
  #新date程序 7XvLinux联盟
  7XvLinux联盟
QUOTE:
if [ $# -lt 1 ] 7XvLinux联盟
  then 7XvLinux联盟
    date 7XvLinux联盟
  else 7XvLinux联盟
    while getopts mdyDHMSTJjwahr OPTION 7XvLinux联盟
    do 7XvLinux联盟
      case $OPTION 7XvLinux联盟
      in 7XvLinux联盟
        m)date '+%m';; 7XvLinux联盟
        d)date '+%d';; 7XvLinux联盟
        y)date '+%y';; 7XvLinux联盟
        D)date '+%D';; 7XvLinux联盟
        H0date '+%H';; 7XvLinux联盟
        M)date '+%M';; 7XvLinux联盟
        S)date '+%S';; 7XvLinux联盟
        T)date '+%T';; 7XvLinux联盟
        j)date '+%j';; 7XvLinux联盟
        J)date '+%y%j';; 7XvLinux联盟
        w)date '+%w';; 7XvLinux联盟
        a)date '+%a';; 7XvLinux联盟
        h)date '+%h';; 7XvLinux联盟
        r)date '+%r';; 7XvLinux联盟
        ?)echo "无效的选项!$OPTION";; 7XvLinux联盟
      esac 7XvLinux联盟
    done 7XvLinux联盟
  fi
7XvLinux联盟
有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。 7XvLinux联盟
7XvLinux联盟
  下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。 7XvLinux联盟
7XvLinux联盟
  #--拷贝程序 7XvLinux联盟
7XvLinux联盟
  7XvLinux联盟
QUOTE:
COPIES=1 7XvLinux联盟
  VERBOSE=N 7XvLinux联盟
  while getopts vc:OPTION 7XvLinux联盟
  do 7XvLinux联盟
    case $OPTION 7XvLinux联盟
    in 7XvLinux联盟
      c)COPIES=$OPTARG;; 7XvLinux联盟
      v)VERBOSE=Y;; 7XvLinux联盟
      ?)echo "无效参数!" 7XvLinux联盟
        exit 1;; 7XvLinux联盟
    esac 7XvLinux联盟
  done 7XvLinux联盟
  if [ $OPTIND -gt $# ] 7XvLinux联盟
  then 7XvLinux联盟
    echo "No file name specified" 7XvLinux联盟
     exit 2 7XvLinux联盟
  fi 7XvLinux联盟
  shift 'expr $OPTIND - 1' 7XvLinux联盟
  FILE=$1 7XvLinux联盟
  COPY=0 7XvLinux联盟
  while [ $COPIES -gt $COPY ] 7XvLinux联盟
  do 7XvLinux联盟
    COPY='expr $COPY + 1' 7XvLinux联盟
    cp $FILE $ {FILE} $ {COPY} 7XvLinux联盟
    if [ VERBOSE = Y } 7XvLinux联盟
    then 7XvLinux联盟
      echo ${FILE} $ {COPY} 7XvLinux联盟
    fi 7XvLinux联盟
  done
7XvLinux联盟
规范Shell: 7XvLinux联盟
7XvLinux联盟
  我们知道环境变量PS1是提示符,看下面程序chdir: 7XvLinux联盟
  7XvLinux联盟
QUOTE:
if [ ! -d "$!" ] 7XvLinux联盟
  then 7XvLinux联盟
    echo "$1 is not a directory" 7XvLinux联盟
    exit 1 7XvLinux联盟
  fi 7XvLinux联盟
  cd $1 7XvLinux联盟
  PS1="'pwd'>" 7XvLinux联盟
  export PS1
7XvLinux联盟
  我们执行: 7XvLinux联盟
7XvLinux联盟
    $chdir /usr/ice666 7XvLinux联盟
7XvLinux联盟
  结果提示符号变成/usr/ice666>了吗?没有,为什么? 7XvLinux联盟
7XvLinux联盟
  原因在于:chdir在子Shell中执行,变量PS1的修改在当前Shell中也不会起作用,若要chdir完成意想中的功能,必须在当前Shell中执行该命令。最好的方法就是把其改成一个函数并且在.profile文件中定义。但若要把函数放到单个文件中并在当前Shell中执行,则需要使用 . 命令,并将chdir重写成一个函数,把其中的exit改写成return。下面代码是 .ice_ps的内容: 7XvLinux联盟
7XvLinux联盟
  #--提示符 7XvLinux联盟
  chdir() 7XvLinux联盟
  { 7XvLinux联盟
  if [ !-d "$1" ] 7XvLinux联盟
  then 7XvLinux联盟
    echo " $1 is not a directory" 7XvLinux联盟
    return 7XvLinux联盟
  fi 7XvLinux联盟
  cd $1 7XvLinux联盟
  PS1="'pwd'>" 7XvLinux联盟
  export PS1; 7XvLinux联盟
  } 7XvLinux联盟
7XvLinux联盟
  然后我们在.profile文件中加入下面语句 7XvLinux联盟
7XvLinux联盟
  .ice_ps 7XvLinux联盟
7XvLinux联盟
  然后在切换目录的时候,我们用chdir命令,结果是什么呢,自己实验好了!   7XvLinux联盟
调试Shell程序 7XvLinux联盟
7XvLinux联盟
1>调试shell程序 7XvLinux联盟
7XvLinux联盟
  用户刚编写完Shell程序中,不可避免的会有错误,这时我们可以利用Bsh中提供的跟踪选项,该选项会显示刚刚执行的命令及参数。用户可以通过set命令打开-x选项或在启动Shell使用-x选项将Shell设置成跟踪模式。例如有下面代码ice_tx: 7XvLinux联盟
7XvLinux联盟
  if [ $# -eq 0 ] 7XvLinux联盟
  then 7XvLinux联盟
    echo "usage:sumints integer list" 7XvLinux联盟
    exit 1 7XvLinux联盟
  fi 7XvLinux联盟
  sum=0 7XvLinux联盟
  until [ $# -eq 0 ] 7XvLinux联盟
  do 7XvLinux联盟
    sum='expr $sum + $1' 7XvLinux联盟
    shift 7XvLinux联盟
  done 7XvLinux联盟
  echo $sum 7XvLinux联盟
7XvLinux联盟
  我们用跟踪模式运行: 7XvLinux联盟
7XvLinux联盟
  $sh -x ice_tx 2 3 4 7XvLinux联盟
  结果显示: 7XvLinux联盟
  +[ 3 -eq 0 ] 7XvLinux联盟
  +sum=0 7XvLinux联盟
  +[ 3 -eq 0 ] 7XvLinux联盟
  +expr 0+2 7XvLinux联盟
  +sum=2 7XvLinux联盟
  +shift 7XvLinux联盟
  +[ 2 -eq 0 ] 7XvLinux联盟
  +expr 2+3 7XvLinux联盟
  +sum=5 7XvLinux联盟
  +shift 7XvLinux联盟
  +[ 1 -eq 0 ] 7XvLinux联盟
  +expr 5+4 7XvLinux联盟
  +sum=9 7XvLinux联盟
  +[ 0 -eq 0 ] 7XvLinux联盟
  +echo 9 7XvLinux联盟
  9 7XvLinux联盟
7XvLinux联盟
  从上面可以看出,跟踪模式下Shell显示执行的每一条命令以及该命令使用的变量替换后的参数值。一些控制字如if、then、until等没显示。 7XvLinux联盟
7XvLinux联盟
2>命令分组 7XvLinux联盟
7XvLinux联盟
  Shell中若干命令可以组成一个单元一起执行。为了标识一组命令,这些命令必须放到"()"或"{}"中。放在"()"中的命令将在子Shell中运行,而放在"{}"中的命令将在当前Shell中运行。子Shell中运行的命令不影响当前Shell的变量。当前Shell中运行的命令影响当前Shell的变量。 7XvLinux联盟
 $NUMBER=2 7XvLinux联盟
  $(A=2;B=2;NUMBER='expr $A+$B';echo $NUMBER) 7XvLinux联盟
  结果为:4 7XvLinux联盟
  $echo $NUMBER 7XvLinux联盟
  结果为:2 7XvLinux联盟
  如果把上面的()变成{},结果会是怎么样的呢? 7XvLinux联盟
7XvLinux联盟
3>使用Shell分层管理器shl 7XvLinux联盟
7XvLinux联盟
  UNIX是一个多道程序设计的操作系统,一些UNIX系统利用这一特性提供了Shell层次管理器shl。使用shl用户一次可以打开多个层次的Shell,其中活跃的Shell可以从终端上获得输入。但所有Shell的输出都可在终端上显示,除非显示被禁止。 7XvLinux联盟
7XvLinux联盟
  多个Shell中有一个为shl,当用户在某个Shell中工作时,可以通过使用特殊字符(一般为Ctrl+z)返回shl。为了同其他Shell区别,shl中提示符为">>>"。当用户工作在Shell层次管理器中时,可以创建、激活和删除Shell,下面是shl中使用的命令。 7XvLinux联盟
7XvLinux联盟
  create name    产生名为name的层次 7XvLinux联盟
  delete name    删除名为name的层次 7XvLinux联盟
  block name     禁止名为name的层次的输出 7XvLinux联盟
  unblock name    恢复名为name的层次的输出 7XvLinux联盟
  resume name    激活名为name的层次 7XvLinux联盟
  toggle   Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
分页:1 [2] 3
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·Unix系列shell程序编写(中)  (2006-06-24 15:08:01)
 ·Unix系列shell程序编写(上)  (2006-06-24 15:06:12)