实例)
现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。并且写一个伪脚本(framework.sh),该脚本包含了大多数脚本都需要的框架结构,是一个非常不错的主意。这时候,在写一个新的脚本时我们只需要执行一下copy命令:
cp framework.sh myscript
然后再插入自己的函数。
让我们再看两个例子:
二进制到十进制的转换
脚本b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:
1 | #!/bin/sh |
2 | #vim:setsw=4ts=4et: |
3 | help() |
4 | { |
5 | cat< |
6 | b2h--convertbinarytodecimal |
7 | USAGE:b2h[-h]binarynum |
8 | OPTIONS:-hhelptext |
9 | EXAMPLE:b2h111010 |
10 | willreturn58 |
11 | HELP |
12 | exit0 |
13 | } |
14 | error() |
15 | { |
16 | #printanerrorandexit |
17 | echo"$1" |
18 | exit1 |
19 | } |
20 | lastchar() |
21 | { |
22 | #returnthelastcharacterofastringin$rval |
23 | if[-z"$1"];then |
24 | #emptystring |
25 | rval="" |
26 | return |
27 | fi |
28 | #wcputssomespacebehindtheoutputthisiswhyweneedsed: |
29 | numofchar=`echo-n"$1"|wc-c|sed's///g'` |
30 | #nowcutoutthelastchar |
31 | rval=`echo-n"$1"|cut-b$numofchar` |
32 | } |
33 | |
34 | chop() |
35 | { |
36 | #removethelastcharacterinstringandreturnitin$rval |
37 | if[-z"$1"];then |
38 | #emptystring |
39 | rval="" |
40 | return |
41 | fi |
42 | #wcputssomespacebehindtheoutputthisiswhyweneedsed: |
43 | numofchar=`echo-n"$1"|wc-c|sed's///g'` |
44 | if["$numofchar"="1"];then |
45 | #onlyonecharinstring |
46 | rval="" |
47 | return |
48 | fi |
49 | numofcharminus1=`expr$numofchar"-"1` |
50 | #nowcutallbutthelastchar: |
51 | rval=`echo-n"$1"|cut-b0-${numofcharminus1}` |
52 | } |
53 | while[-n"$1"];do |
54 | case$1in |
55 | -h)help;shift1;;#functionhelpiscalled |
56 | --)shift;break;;#endofoptions |
57 | -*)error"error:nosuchoption$1.-hforhelp";; |
58 | *)break;; |
59 | esac |
60 | done |
61 | #Themainprogram |
62 | sum=0 |
63 | weight=1 |
64 | #oneargmustbegiven: |
65 | [-z"$1"]&&help |
66 | binnum="$1" |
67 | binnumorig="$1" |
68 | |
69 | while[-n"$binnum"];do |
70 | lastchar"$binnum" |
71 | if["$rval"="1"];then |
72 | sum=`expr"$weight""+""$sum"` |
73 | fi |
74 | #removethelastpositionin$binnum |
75 | chop"$binnum" |
76 | binnum="$rval" |
77 | weight=`expr"$weight""*"2` |
78 | done |
79 | echo"binary$binnumorigisdecimal$sum" |
80 |
该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:
0 * 1 + 1 * 2 = 2
为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。