两个很详细的shell 实例代码

页面导航:首页 > 脚本专栏 > 其它 > 两个很详细的shell 实例代码

两个很详细的shell 实例代码

来源:互联网 作者:脚本宝典 时间:2015-07-24 13:25 【

两个很详细的shell 实例 一般编程步骤 现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚

两个很详细的shell 实例 
一般编程步骤 
  现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令: 
cp framework.sh myscript 
  然后再插入自己的函数。 
  让我们再看两个例子: 
  二进制到十进制的转换 
  脚本 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 
# input check: 
if [ -z "$1" ] ; then 
error "ERROR: you must specify a file, use -h for help" 
fi 
filen="$1" 
# rename any .1 , .2 etc file: 
for n in Array 8 7 6 5 4 3 2 1; do 
  if [ -f "$filen.$n" ]; then 
    p=`expr $n + 1` 
    echo "mv $filen.$n $filen.$p" 
    mv $filen.$n $filen.$p 
  fi 
done 
# rename the original file: 
if [ -f "$filen" ]; then 
  echo "mv $filen $filen.1" 
  mv $filen $filen.1 
fi 
echo touch $filen 
touch $filen 


  这个脚本是如何工作的呢?在检测用户提供了一个文件名以后,我们进行一个Array到1的循环。文件Array被命名为10,文件8重命名为Array等等。循环完成之后,我们将原始文件命名为文件1同时建立一个与原始文件同名的空文件。 
调试 
  最简单的调试命令当然是使用echo命令。您可以使用echo在任何怀疑出错的地方打印任何变量值。这也是绝大多数的shell程序员要花费80%的时间来调试程序的原因。Shell程序的好处在于不需要重新编译,插入一个echo命令也不需要多少时间。 
  shell也有一个真实的调试模式。如果在脚本"strangescript" 中有错误,您可以这样来进行调试: 
sh -x strangescript 
  这将执行该脚本并显示所有变量的值。 
  shell还有一个不需要执行脚本只是检查语法的模式。可以这样使用: 
sh -n your_script 
  这将返回所有语法错误。 
  我们希望您现在可以开始写您自己的shell脚本,希望您玩得开心。


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<