Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104647441
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-28 21:34:19

 
文章来源ChinaITLab 收集整理

  前言:
  
  这里只介绍B-SHELL的一些运用方法,不对B-SHELL的基本知识进行说明(与其他的语言有很多的共性,果你懂一种语言的话,很快就能上手),如你是对B-SHELL不是很了解的话,而且又想学的话,建议你去查阅相关的资料(网上有很多关于这方面的东东;当然也可买些书;如果你是一个借别人的书才能阅读的人,那就去借吧!我就是这样的人之一。)。我的能力有限,若有不足或错误,请多多指教,小弟将感激不尽!所有的介绍适合于内核2.2.13的及以上的liunx环境。
  
  B-SHELL是一个便捷的开发工具,在紧急情况下要实现产品的某一功能,而用C语言不能很快完成,则可选择B-SHLL实现,日后再用C语言完成;在产品里对于那些不常运行的程序可用B-SHELL替代,这样可以避免因对C语言使用不当而带来的不良后果;对于一些处理量不大的程序可用B-SHELL实现。
  
  
  讨论:
  
  
  #!/bin/sh à B-SHELL的解释器标志
  
  
  ALL=$@
  
  #{
  
  B-SHELL中带”$”的变量的说明:$0à SHELL命令本身
  
  $nà 位置参数n(n != 0)
  
  $@à 所有的输入变量
  
  $$à 当前进程号
  
  $!à 最近后台进程的PID值
  
  $?à 最近命令执行状态的返回值
  
  $#à 参数的个数
  
  }#
  
  declare -x TIME=0
  
  #{
  
  变量声明的说明:
  
  
  declare 声明全局变量;如果在函数内声明,则只在函数内有效(局部变量);-x表明变量值可以传递给后继命令(从函数传值给后继命令);-i表明变量作为整型处理;-r表明变量为只度;用“+”代替“-”,原有变量的声明屏蔽,恢复为无定义状态。由第一次赋值决定其参数在脚本中的性质,如果首次是字符,以后都当字符处理,其它等同。
  
  
  local声明局部变量;local 变量名 [ = “值”];一般在函数内部运用。
  
  
  直接定义变量,不用declare 和local指明。由第一次赋值决定其参数在脚本中的性质,如果首次是字符,以后都当字符处理,其它等同。也可在定义确定。
  
  }#
  
  declare -x NUMBEROFFILE=0
  
  #{
  
  关于脚本函数说明:
  
  定义方式:function 函数名() 或 函数名()
  
  {
  
  函数体(作你想要作的事)
  
  }
  
  调用方式:函数名 参数列
  
  在脚本里函数的调用就象调用命令一样使用。à 后面将会提到
  
  }#
  
  
  function hel_ver() à 显示帮助信息或版本号
  
  {
  
  
  if [ "$1" = "-h" ] ;then
  
  echo "fstrf -v :show version of shell script."
  
  echo "Usages : fstrf -h||-v "
  
  echo " fstrf ARGUMENTS DIRECTORY STRING || fstrf ARGUMENTS STRING "
  
  echo " For more informations run man fstrf."
  
  exit
  
  fi
  
  
  if [ "$1" = "-v" ] || [ "$1" = "version" ];then
  
  echo "fstrf version 1.0.1 2001/07/05."
  
  exit
  
  fi
  
  }
  
  
  function find_offer() à 在给定的目录下查找是否有包含指定字串的文件,并显示其路径
  
  {
  
  for file in `ls "$1"` à for var in command do ………done 的一个典型运用;对$1目录下的目录或文件进行处理
  
  do
  
  if [ -d "$1"/$file ];then à 判断$file是否为目录
  
  continue
  
  else
  
  string=`grep "$2" "$1"/$file ` à 查找字串
  
  if [ -n "$string" ];then à 判断字串为非空
  
  echo $string > /str
  
  str=`awk '{print $1 }' /str` à 取得str 的第一域值
  
  rm /str
  
  if [ "$str" != "Binary" ];then à 剔除二进制文件
  
  NUMBEROFFILE=`expr $NUMBEROFFILE + 1 ` à 相当于C语言的NUMBEROFFILE +=1;可用
  
  let ‘ NUMBEROFFILE=NUMBEROFFILE + 1‘替换
  
  TIME=`expr $TIME + 1`
  
  echo "$1/$file" à 显示匹配文件
  
  fi
  
  fi
  
  fi
  
  done
  
  
  }
  
  
  #else
  
  function find_curr() à 在当前目录下查找是否有包含指定字串的文件,并显示其路径(相对路径)实现机制与find_offer相同
  
  {
  
  # if [ "$#" -eq "1" ];then à
  
  for file in `ls ./` 如果只输入一个参数,则查找当前工作目录下的文件
  
  do
  
  if [ -d "$file" ];then
  
  continue
  
  else
  
  string=`grep "$1" $file`
  
  if [ -n "$string" ];then
  
  echo $string > /str
  
  str=`awk '{print $1 }' /str`
  
  rm /str
  
  if [ "$str" != "Binary" ];then
  
  NUMBEROFFILE=`expr $NUMBEROFFILE + 1 `
  
  TIME=`expr $TIME + 1`
  
  echo "./$file"
  
  fi
  
  fi
  
  fi
  
  done
  
  }
  
  function print_num() à 显示查找的文件数 (在查多级目录时未能实现,如果你知道,告诉我,我会很高兴的!)
  
  {
  
  if [ "$NUMBEROFFILE" -gt "0" ] ;then
  
  # echo ""
  
  if [ "$#" -eq "1" ];then
  
  #{
  
  关于彩色显示的说明:
  
  不同的系统,运行的命令的方式都不一样。在LINUX/BSD系统中:echo -e “\033[40;32m”;在V系统中:echo “\033[40;32m”。本例中采用前一种方式。40位为背景色,取值40��47之间;32位为前景色,取值30��37之间;\033是固定用法。彩色显示要成队匹配,如脚本所示。通常后一个色彩控制为
  
  echo -e "\033[40;37m" (意思是恢复正常色)。彩色显示控制通常是成对出现,例如,
  
  `echo -e "\033[40;33m"`"$2"`echo -e "\033[40;37m"`
  
  echo -e "\033[40;37m"à 恢复正常显示(黑背景,白前景)。利用彩色显示控可以作出漂亮的liunx菜单(当然不能与Xwindows和WINDOWS相比)。
  
  }#
  
  echo "Finded `echo -e "\033[40;32m"`$NUMBEROFFILE`echo -e "\033[40;37m"` file(s) which have the string `echo -e "\033[40;33m"`"$1"`echo -e "\033[40;37m"` ."
  
  else
  
  echo "Finded `echo -e "\033[40;32m"`$NUMBEROFFILE`echo -e "\033[40;37m"` file(s) which have the string `echo -e "\033[40;33m"`"$2"`echo -e "\033[40;37m"`. "
  
  fi
  
  else
  
  if [ -z "$2" ];then
  
  echo "Finded `echo -e "\033[40;32m"`no `echo -e "\033[40;37m"`file under current directory."
  
  else
  
  echo "Finded `echo -e "\033[40;32m"`no `echo -e "\033[40;37m"`file under directory "$1"."
  
  fi
  
  fi
  
  }
  
  function fdir() à 从给定的目录开始查找当前目录及其子目录的包含的目录,并存入/tmp/dtmp文件。
  
  {
  
  >/tmp/dtmp
  
  #cd /
  
  echo "$1" >/tmp/dtmp
  
  tmp=`echo $1 | grep "\/proc"`à 不查找/proc目录下的目录
  
  if [ ! -z $tmp ];then
  
  # echo "/proc"
  
  exit
  
  fi
  
  i=`expr $i + 1 ` à 记录找到的目录数目,每向/tmp/dtmp文件加一目录记录时此值加一(以下同样)
  
  ###first grade
  
  cd $1 à 进入脚本的工作目录(不会改变控制台的工作目录)
  
  for loop in `ls ./`
  
  do
  
  # echo $loop
  
  if [ -d $loop ];then à 判断$loop是否为目录(以下同样)
  
  tmp=`echo $loop | grep "proc"`
  
  if [ ! -z $tmp ];then
  
  continue
  
  fi
  
  i=`expr $i + 1 `
  
  echo "`pwd`/$loop" >>/tmp/dtmp à 连同目录的绝对路径加入/tmp/dtmp文件(以下同样)
  
  ###second grade
  
  cd $loop à 进入脚本二级工作目录
  
  for loop1 in `ls ./`
  
  do
  
  # echo $loop1
  
  if [ -d $loop1 ];then
  
  tmp=`echo $loop1 | grep "proc"`
  
  if [ ! -z $tmp ];then
  
  continue
  
  fi
  
  i=`expr $i + 1 `
  
  echo "`pwd`/$loop1" >>/tmp/dtmp
  
  ###third grade
  
  cd $loop1à 进入脚本三级工作目录
  
  for loop1 in `ls ./`
  
  do
  
  # echo $loop1
  
  if [ -d $loop1 ];then
  
  i=`expr $i + 1 `
  
  echo "`pwd`/$loop1" >>/tmp/dtmp
阅读(542) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~