updatepkgコマンドの作成
前述の通り,
まず最初に作ってみたのはパッケージ名からベース名を取り出し,
1 #!/bin/sh
2 pkg=$1
3 base=`echo $pkg | cut -f1 -d'-'`
4 chk=`ls /var/log/packages/* | grep $base`
5 if [ "$chk.x" != ".x" ]; then
6 echo "removepkg $base"
7 fi
8 echo "installpkg $pkg"
このスクリプトでは,
2行目で$pkgという変数に1つめの引数
3行目で$pkgからcutを使ってパッケージのベース名を取り出して$base変数に代入し,
4行目で/var/
5行目で$chk変数に何か文字列が入っているかを調べ,
6行目のremovepkgでアンインストールしてから,
8行目のinstallpkgで指定されたパッケージをインストールする,
という流れになっています。
なお,
アップデートするパッケージが1つだけならこのスクリプトでも動きそうですが,
1 #!/bin/sh
2 for pkg in $* ; do
3 base=`echo $pkg | cut -f1 -d'-'`
4 chk=`ls /var/log/packages/* | grep $base`
5 if [ "$chk.x" != ".x" ]; then
6 echo "removepkg $base"
7 fi
8 echo "installpkg $pkg"
9 done
この例では2行目の$*で引数として指定した全てのパッケージを対象にforループで処理を回すようにしています。
このスクリプトを使えば,
1 #!/bin/sh
2 for tmppkg in $* ; do
3 pkg=`basename $tmppkg`
4 base=`echo $pkg | cut -f1 -d'-'`
5 chk=`ls /var/log/packages/* | grep $base`
6 if [ "$chk.x" != ".x" ]; then
7 echo "removepkg $base"
8 fi
9 echo "installpkg $tmppkg"
10 done
以前は直接$pkgに引数で指定したパッケージ名を代入していましたが,
このスクリプトでだいたい思ったような動作になりましたが,
1 #!/bin/sh
2 for tmppkg in $* ; do
3 pkg=`basename $tmppkg`
4 base=`echo $pkg | cut -f1 -d'-'`
5 chk=`ls /var/log/packages/* | grep "^$base$" `
6 if [ "$chk.x" != ".x" ]; then
7 echo "removepkg $base"
8 fi
9 echo "installpkg $tmppkg"
10 done
5行目のgrepの変更した引数"^$base$"は正規表現を使った指定で,
とりあえずこの程度で必要な処理は行えそうですが,
1 #!/bin/sh
2 if [ $# = 0 ]; then
3 echo "usage: $0 package(s)"
4 exit
5 fi
6 for tmppkg in $* ; do
7 pkg=`basename $tmppkg`
8 base=`echo $pkg | cut -f1 -d'-'`
9 chk=`ls /var/log/packages/* | grep "^$base$" `
10 if [ "$chk.x" != ".x" ]; then
11 echo "removepkg $base"
12 fi
13 echo "installpkg $tmppkg"
14 done
追加した2行目から4行目の処理は,
% ./updatepkg usage: ./updatepkg package(s)
今回はこのあたりで止めておきますが,
このようにテストしながら問題点をさっと修正したり,
筆者の場合,