Unix系列shell程序编写6

来源:互联网 发布:2017网络作家 编辑:程序博客网 时间:2024/06/03 18:24
与或结构
使用与/或结构有条件的执行命令
  Shell程序中可以使用多种不同的方法完成相同的功能,例如until和while语句就可以完成相同的功能,同样,除了if-then-else结构可以使命令有条件的执行外,$$和||操作符也能完成上述功能。在C语言中这两个操作符分别表示逻辑与和逻辑或操作。在BourneShell中,用&&连接两条命令的含义只有前面一条命令成功执行了,后面的命令才会执行。
  &&操作的形式为:
    command && command
  例如语句:
    rm $TEMPDIR/* && echo "Files successfully removed"
  只有rm命令成功执行以后,才会执行echo命令。若用if-then语句实现上述功能,形式为:
    if rm $TEMPDIR/*
    then
      echo "Files successfully removed"
    fi
  相反,用||连接两条命令的含义为只有第一条命令执行失败才执行第二条命令,例如:
    rm $TEMPDIR/* || echo "File were not removed"
  上面语句的等价形式为:
    if rm $TEMPDIR/*
    then
      :
    else
      echo "Files were not removed"
    fi
  这两种操作符可以联合使用,如在下面的命令行中,只有command1和command2执行成功后,command3才会执行:
    command1 && command2 && command3
  下面的命令行表示只有command1成功执行,command2不成功执行时,才会执行command3。
  &&和||操作符可以简化命令条件执行的格式,但一般只用于一条命令的条件执行。如果许多命令都使用这两个操作符,那么整个程序的可读性将变的很差,所以在多条命令的条件执行时,最好采用可读性好的if语句。
函数
  现在我们介绍Shell程序中的函数部分,基本上任何高级语言都支持函数这个东西,能让我们胜好多事情的东西,至少省的频繁的敲击相同的东西,好了come on
Shell程序中的函数
  函数又叫做子程序,可以在程序中的任何地方被调用,其格式如下:
  函数名字()
  {
    command
    ... ...
    command;
  }
  Shell程序的任何地方都可以用命令 "函数名字" 调用,使用函数的好处有两点,一点是使用函数可以把一个复杂的程序化为多个模块,易于管理,符合结构化程序的设计思想,另一个好处是代码的重用。
  Shell函数和Shel程序比较相似,它们的区别在于Shell程序在子Shell中运行,而Shell函数在当前Shell中运行。因此,在当前Shell中可以看到Shell函数对变量的修改。在任何Shell中都可以定义函数,包括交互式Shell。
  例如:
    $dir() {ls -l;}
    结果是我们在$后面打dir,其显示结果同ls -l的作用是相同的。该dir函数将一直保留到用户从系统退出,或执行了如下所示的unset命令:
    $unset dir
    下面的例子说明了函数还可以接受位置参数:
    $dir(){_
    >echo "permission    ln owner   group    file sz last access
    >ls -l $*;
    >}
    运行 dir a* 看产生什么结果
    参数a*传递到dir函数中并且代替了$*
    通常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

原创粉丝点击