Decode360's Blog

业精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

  BlogJava :: 首页 :: 新随笔 :: 联系 ::  :: 管理 ::
  397 随笔 :: 33 文章 :: 29 评论 :: 0 Trackbacks
Linux shell程序设计(八).杂项
 
    好了,今天是shell变成学习的最后一篇,介绍一下其它的一些相关知识,对于初学者来说,这些只是应该是最迫切需要掌握的,因为一些if、for的语句可以慢慢领悟,但如果不了解这些边边角角的内容,别人写的例子就看不懂,严重打击自信心。所以今天的这一篇是非常重要滴。
 
 
一、算术运算
 
    bash中的算术运算符命令为let,其语法为:
    let arg ...
    其中:arg是单独的算术表达式,基本用法与C语言相同。但不能使用“++”、“--”、“,”;但提供了“**”做方幂运算。
 
    let命令可以用(())代替
    例如:
    let "j=i*6+2" 和 ((j=i*6+2)) 等价
 
    let返回结果非0,则返回状态值为0,否则返回状态值为1。
 
    注:若有特殊字符,必须有双引号括起来,比如 let "val=a|b",若不用引号则会认为|是管道符。
 
 
二、函数
 
    函数定义的格式为:
    [function]函数名()
    {
      命令表
    }
    其中function关键字可以默认不写, 调用函数时直接使用函数名,不用带(),就像使用一般的命令一样。
 
    举例:
    $ cat ex17
      #func is a function name
      #it echo the values of variables and arguments
      func()
      {
        echo "Let's begin now."
        echo $a $b $c
        echo $1 $2 $3
        echo "The end."
      }
      a="Working directory"
      b="is"
      c=`pwd`
      func Welcome You Byby
      echo "Today is `date`"
    $ ./ex17
      Let's begin now.
      Working directory is /home/wangxiaoqi
      Welcome You Byby
      The end.
      Today is .....
 
    另注:可以直接使用return命令退出函数。后面可带参数指定退出值。
 
 
三、作业控制
 
    在命令行最后加一个“&”就可以使该命令成为后台作业。
    如果set命令的monitor选项被打开,即执行了 set -o monitor 命令,则shell进入作业管理。
 
1、jobs命令
 
    不带参数的jobs命令可以列出当前尚未完成的作业。例如:
    $ jobs
      [2] +Done               who| wc -cd
      [1] -Stopped(SIGTTOU)   man ls&
 
    说明:[]中的整数代表作业号,后面的“+”代表当前作业,“-”代表前一个作业。在“+-”后面列出作业状态,最后则是作业的内容。
 
2、kill命令
 
    kill命令可以向指定进程发送终止信号,例如:15表示使作业正常中止运行;9表示立即终止进程。
 
    kill -9 1893
    表示终止PID为1893进程的运行。
 
    注:利用 kill -l 可以列出全部的信号名
 
3、bg和fg命令
 
    bg用于把前台作业切换到后台,fg则相反。
 
    $ bg(fg) %1
    表示将作业1切换的后台(前台)
 
    注:如果不带参数,表示切换当前job
 
 
四、shell内置命令
 
1、eval命令
 
    该命令可以将一个字符串当作命令行来执行,例如:
    $ a="id | cut -f1 -d' '"
    $ eval $a
      uid=0(root)
 
    说明:不用eval命令,那么在执行时就会将“| cut -f1 -d”都作为了id命令的参数。时候eval后,它会把第一遍命令行处理所得的"id", "|", "cut", "-f1", "-d"这些字符串再次进行命令行处理,这次就能正确分析其中的管道了。
 
2、exec命令
 
    格式: exec [ arg ... ]
    作用:在本shell中执行由参数arg指定的命令,不创建新进程。
    注意:arg中允许有输入/输出重定向。
 
3、hash命令
 
    格式: hash [ -r ] [ name ... ]
    作用:记住name指定的每个命令在搜索路径中的位置,[-r]则正好相反。
    注意:如果没有参数,则列出所有已记忆的命令信息
 
4、readonly命令
 
    格式:readonly [ name ... ]
    作用:将name变量标记为只读
    注意:若没有参数,则列出所有只读变量的清单
 
5、trap命令
 
    格式:trap [ arg ] [ n ] ...
    作用:当收到后面的[n]信号时,执行arg
 
6、type命令
 
    格式:type [ name ... ]
    作用:对于每个name,如果作为命令名,是如何被解释的
 
7、unset命令
 
    格式:unset [ name ... ]
    作用:删除name的相应变量或函数
    注意:PATH、PS1、PS2、MAILCHECK、IFS不能被删除
 
8、umask命令
 
    格式:umask [-S][mask]
    作用:将用户文件创建掩码设置为mask的值
    注意:若mask为八进制数,则对应位被置上;若mask为符号,则用来设置权限;若无mask,则显示当前掩码;-S以符号形式显示有关信息(rwx等权限)
 
9、wait命令
 
    格式:wait [n]
    作用:等待由n(进程ID)指定的进程终止,并报告终止状态
    注意:若无参数,则等待所有进程终止。改参数返回值永远为0
 
 
五、脚本调试
 
1、解决环境设置问题
 
    ① 无法在其他环境下执行bash脚本。
 
    在shell脚本第一行加上 #!/bin/bash
 
    ② PATH环境变量没有包括“.”,无法识别当前目录
 
    PATH=$PATH:.
 
    ③ 脚本文件与已存在命令名字相同
 
    修改脚本名
 
2、解决脚本错误
 
    调试shell脚本的方法是打开set命令的-x选项,或者在启动shell时使用-x选项,则shell进入跟踪模式。
 
    另一种方法是多使用echo和print命令,这样可以根据显示来判断程序错误发生在哪一步。
 
    注:尽量改一次错误执行一次,以判断确切的错误发生地。
 
 
posted on 2009-01-13 21:19 decode360 阅读(305) 评论(0)  编辑  收藏 所属分类: 03.Linux

只有注册用户登录后才能发表评论。


网站导航: