完成版スクリプト
オプション解析機能を追加し,
リスト6 完成版のインストールスクリプト
1 #!/bin/sh
2
3 get_version() {
4 local old_name=`cat /var/log/packages/$1 | grep "^PACKAGE NAME" | cut -f2 -d':' `
5 local old_vers=`echo $old_name | cut -f2 -d'-'`
6 echo $old_vers
7 }
8
9 check_vers() {
10 local old=$1
11 local new=$2
12
13 for i in 1 2 3 4 5; do
14 t1=`echo $old | cut -f$i -d'.'`
15 t2=`echo $new | cut -f$i -d'.'`
16 if [ $t2 -gt $t1 ]; then
17 return $t2
18 fi
19 done
20 return 0
21 }
22
23 usage() {
24 echo "usage: $0 [-f] [-h] package(s)"
25 echo " -f force install mode(without version check)"
26 echo " -h help(this message)"
27 exit
28 }
29
30 for opt in $*
31 do
32 case $opt in
33 -f)
34 force_flag=1 ; shift ;;
35 -h)
36 usage ;;
37 esac
38 done
39
40 if [ $# = 0 ]; then
41 usage
42 fi
43
44 for tmppkg in $* ; do
45 pkg=`basename $tmppkg`
46 base=`echo $pkg | cut -f1 -d'-'`
47 vers=`echo $pkg | cut -f2 -d'-'`
48 chk=`ls /var/log/packages | grep "^$base$" `
49 if [ "$chk.x" != ".x" ]; then
50 if [ "$force_flag.x" != ".x" ]; then
51 /sbin/removepkg $base
52 else
53 old_vers=`get_version $base`
54 check_vers $old_vers $vers
55 ver_test=$?
56 if [ $ver_test != "0" ]; then
57 /sbin/removepkg $base
58 else
59 echo "same or newer vesion($chk-$old_vers) has been installed."
60 echo "installation stopped for $tmppkg"
61 continue
62 fi
63 fi
64 fi
65 /sbin/installpkg $tmppkg
66 done
23から28行目が,
30から38行目がオプションの解析部分で,
40から42行目は-fオプションを除いても引数
パッケージをインストールする44行目からのループでは,
数字以外が含まれた際のバージョンチェックやパッケージごとの強制インストールの有無など,
今回はシェルスクリプトを作っていく過程を順を追って紹介しました。たいていのソースコードは,
本連載で紹介してきた文書の読み方同様,