日期:2014-05-16  浏览次数:20888 次

Linux shell脚本全面学习5
让我们再看两个例子:
  二进制到十进制的转换
  脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
  #!/bin/sh
  # vim: set sw=4 ts=4 et:
  help()
  {
  cat <
  b2h -- convert binary to decimal
  USAGE: b2h [-h] binarynum
  OPTIONS: -h help text
  EXAMPLE: b2h 111010
  will return 58
  HELP
  exit 0
  }
  error()
  {
  # print an error and exit
  echo "$1"
  exit 1
  }
  lastchar()
  {
  # return the last character of a string in $rval
  if [ -z "$1" ]; then
  # empty string
  rval=""
  return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  # now cut out the last char
  rval=`echo -n "$1" | cut -b $numofchar`
  }
  chop()
  {
  # remove the last character in string and return it in $rval
  if [ -z "$1" ]; then
  # empty string
  rval=""
  return
  fi
  # wc puts some space behind the output this is why we need sed:
  numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
  if [ "$numofchar" = "1" ]; then
  # only one char in string
  rval=""
  return
  fi
  numofcharminus1=`expr $numofchar "-" 1`
  # now cut all but the last char:
  rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
  }
  while [ -n "$1" ]; do
  case $1 in
  -h) help;shift 1;; # function help is called
  --) shift;break;; # end of options
  -*) error "error: no such option $1. -h for help";;
  *) break;;
  esac
  done
  # The main program
  sum=0
  weight=1
  # one arg must be given:
  [ -z "$1" ] && help
  binnum="$1"
  binnumorig="$1"
  while [ -n "$binnum" ]; do
  lastchar "$binnum"
  if [ "$rval" = "1" ]; then
  sum=`expr "$weight" "+" "$sum"`
  fi
  # remove the last position in $binnum
  chop "$binnum"
  binnum="$rval"
  weight=`expr "$weight" "*" 2`
  done
  echo "binary $binnumorig is decimal $sum"
  该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
  0 * 1 + 1 * 2 = 2
  为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。
  文件循环程序
  或许您是想将所有发出的邮件保存到一个文件中的人们中的一员,但是在过了几个月
  以后,这个文件可能会变得很大以至于使对该文件的访问速度变慢。下面的 脚本rotatefile
  可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,
  而对于outmail.1就变成了outmail.2 等等等等...
  #!/bin/sh
  # vim: set sw=4 ts=4 et:
  ver="0.1"
  help()
  {
  cat <
  rotatefile -- rotate the file name
  USAGE: rotatefile [-h] filename
  OPTIONS: -h help text
  EXAMPLE: rotatefile out
  This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1
  and create an empty out-file
  The max number is 10
  version $ver
  HELP
  exit 0
  }
  error()
  {
  echo "$1"
  exit 1
  }
  while [ -n "$1" ]; do
  case $1 in
  -h) help;shift 1;;
  --) break;;
  -*) echo "error: no such option $1. -h for help";exit 1;;
  *) break;;
  esac
  done