Saya punya persyaratan sederhana. Saya ingin mendefinisikan beberapa variabel yang akan sesuai dengan sejumlah paket yang diberikan yang ingin saya instal melalui skrip shell.
Contoh kode di bawah ini:
MISC="shutter pidgin"
WEB="apache2 mongodb"
for pkg in $MISC $WEB; do
if [ "dpkg-query -W $pkg | awk {'print $1'} = """ ]; then
echo -e "$pkg is already installed"
else
apt-get -qq install $pkg
echo "Successfully installed $pkg"
fi
done
Semuanya agak berfungsi, tetapi logika tampaknya cacat karena itu tidak dapat dipercaya menginstal paket yang saya inginkan. Entah itu mengatakan mereka sudah diinstal atau sedang mencoba untuk menginstal paket yang sudah diinstal sebelumnya.
Saya juga sudah mencoba dengan command -v
atau yang berikut:
if [ "dpkg -l | awk {'print $2'} | grep --regexp=^$pkg$ != """ ]; then
Dan bahkan dengan -n
dan-z
bendera untuk memeriksa apakah string yang dikembalikan kosong. Cukup yakin saya kehilangan akal sehat di sini.
Apakah Anda tahu apa yang bisa saya lakukan untuk memastikan paket benar-benar diinstal atau tidak?
Terima kasih!
apt-get install
paket yang diinstal juga? Anda bisa meneleponapt-get install $MISC $WEB
.Jawaban:
Pada dasarnya Anda hanya perlu mengganti
if
kondisinyaItu tidak mungkin untuk digunakan
dpkg-query
, karena ia mengembalikan true juga untuk paket yang dihapus tetapi tidak dibersihkan.Saya juga menyarankan untuk memeriksa kode keluar
apt-get
sebelum memberikan pesan yang berhasil:sumber
&>
harus dilakukan/dev/null
dalam hal ini), karena kita tidak memerlukan output, hanya kode keluar. Ini hanya berfungsi dibash
(baris pertama skrip harus#!/bin/bash
) jika tidak digunakan>/dev/null 2>&1
.Anda dapat mengujinya dengan dpkg-query:
Perhatikan bahwa * dan? adalah wildcard, jika muncul dalam $ pkg. Saya kira dpkg-query dapat mencetak "instal-diperlukan diinstal" bukan "ok diinstal", jika paket rusak dan perlu diinstal ulang dengan perintah
apt-get install --reinstall
yang dapat digunakan untuk menginstal paket baru juga.sumber
sumber