改訂版スクリプト
それでは,
リスト4 バージョンチェックスクリプト
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 if [ $# = 0 ]; then
24 echo "usage: $0 package(s)"
25 exit
26 fi
27 for tmppkg in $* ; do
28 pkg=`basename $tmppkg`
29 base=`echo $pkg | cut -f1 -d'-'`
30 chk=`ls /var/log/packages | grep "^$base$" `
31 if [ "$chk.x" != ".x" ]; then
32 vers=`echo $pkg | cut -f2 -d'-'`
33 old_vers=`get_version $base`
34 check_vers $old_vers $vers
35 ver_test=$?
36 if [ $ver_test != "0" ]; then
37 echo "removepkg $base"
38 else
39 echo "same or newer vesion($chk-$old_vers) has been installed."
40 echo "stop installation for $tmppkg"
41 continue
42 fi
43 fi
44 echo "installpkg $tmppkg"
45 done
3行目から21行目が今回作成した関数です。シェルスクリプトの関数は実行される前に定義しておかないといけないので,
33行目と34,
一方,
36行目からは$ver_
修正とお詫びを1件。この例では30行目にあたるls /var/
ls /var/
オプション解析機能
いくつかのパッケージで動作テストしてみると,
原因は-gtに代表されるシェルスクリプトの比較演算子が整数の大小を見分ける機能しか持たないことで,
rc
バージョン番号に数字以外が含まれた場合の処理を考えるのは面白いテーマになりそうですが,
リスト5 オプション引数の処理
1 for opt in $*
2 do
3 case $opt in
4 -f)
5 force_flag=1 ; shift ;;
6 -h)
7 usage ;;
8 esac
9 done
この処理は,
1行目の $* は引数全てを意味し,
オプション引数を解析するにはgetoptと言う便利な機能もあるのですが,