Skrypt Bash, przypisananie zminnej wyniku polecenia


(Krzkaczor) #1

Hej!

Mam taki progam:

#!/bin/bash 

file="/var/log/upgrades.log"

status=`echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

#aptitude update  

if [[$status] == "" ]

then

	echo "Nothing" > $file

else

	echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages' > $file

fi

I coś nie działa:/ Dlatego zastanawiam się jak w bashu przypisuje się wynik działania jakiegoś polecenia do funkcji i jak potem ifa do tego sklepać? Próbowałem już na wiele sposobów i cały czas wyskakują jakieś errory :confused:

Proszę o pomoc i pozdrawiam


(dragonn) #2

Ja zawsze robię tak:

polecenie > plik.txt

read zmiena < plik.txt

(matiit) #3
REALLOCATED_S=`smartctl -a /dev/${DEVICE} | grep Reallocated_Sector_Ct | awk '{ if (NR==1) { print $10 }}'`

Przykład z mojego skryptu do monitorowania dysków. Działa bardzo dobrze... Zapisuj zmienne wielkimi literami.


(roobal) #4

Nie działa, bo masz niepotrzebne echo w tej linii, w takim wypadku polecenie aptitude full-upgrade... się nie wykonuje, dlatego nie ma żadnego efektu :slight_smile:

status=`echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

Natomiast drugi błąd masz tutaj

echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages' > $file

Zapomniałeś zacytować odpowiednio polecenie, dlatego się ono nie wykona i nie uzyskasz wyniku. Tak poza tym to skąd wziąłeś w ogóle opcję full-upgrade, bo aż z ciekawości zajrzałem do manuala aptitude i nie widzę tam takiej opcji, nie chodzi Ci przypadkiem o dist-upgrade, które wykonuje właśnie pełną aktualizację? Moim zdaniem ten skrypt jest pozbawiony w ogóle sensu, szczególnie te linie:

status=`echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

if [[$status] == "" ]

echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages' > $file

Równie dobrze mógłbyś zakończyć na tej linii:

status=`echo aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

Tylko zrobić to tak:

#!/bin/bash

status=`aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

echo $status > plik.txt

Bo warunek, który utworzyłeś robi dokładnie to samo zwłaszcza, gdy tworzysz i tak plik z logiem, do którego i tak musisz zaglądać. Lepszym rozwiązaniem by było stworzyć coś w ten sposób:

#!/bin/bash

if jesli_sa_aktualizacje; then

echo `polecenie` > log

fi

if [-e log];then

xterm -e nano log

fi

EDIT: @dragonn

A widzisz w helpie jest a w manualu nie ma :slight_smile:

Pozdrawiam!


(dragonn) #5

Jest, co prawda to wynik z ubuntu 9.10, bo nie mam teraz pod ręką debiana, ale pamiętam że w debianie też było(przynajmniej jak go jeszcze używałem):

dragonn@ubuntu:~$ aptitude --help | grep full-upgrade

 full-upgrade - Aktualizacja systemu; możliwa instalacja/usunięcie pakietów

(roobal) #6

Nie wiem dokładnie czy chcesz uzyskać tylko i wyłącznie log czy jeśli pojawią się aktualizacje to chcesz je od razu instalować. W wolnej chwili na szybko sklepałem takie coś:

#!/bin/bash


# Logi możesz zapisać, np. w katalogu domowym w podkatalogu logi.


logs=$HOME/logi


# Sprawdzas dostępność aktualizacji.


status=`aptitude full-upgrade -s | awk '{if (NR==6) {print $1}}'`


# Sprawdzasz warunek na zasadzie sprzeczności. Zmienna status sprawdza ile pakietów zostanie zainstalowanych po wydaniu polecenia aktualizacji, jeśli liczbą będzie różna od zero to zostanie zapisane wszystko w logu, w przeciwnym wypadku skrypt zakończy działanie.


if [$status != 0]; then

	echo `aptitude full-upgrade -s` > $logs/log

fi


# Jeśli pojawi się log poniższa instrukcja warunkowa nakazuje wyświetlenie zawartości logu w edytorze tekstu Nano w terminalu Xterm, w tym miejscu możesz wstawić inne polecenie, np. polecenie aktualizacji, zamiast wyświetlania logu. Wyglądałoby to tak: xterm -e aptitude full-upgrade. Log po zamknięciu terminala z edytorem Nano zostanie usunięty.


if [-e $logs/log]; then

	xterm -e nano $logs/log

	rm $logs/log

fi

W skrócie i bez komentarzy wygląda to tak:

#!/bin/bash


logs=$HOME/logi

status=`aptitude full-upgrade -s | awk '{if (NR==6) {print $1}}'`


if [$status != 0]; then

	echo `aptitude full-upgrade -s` > $logs/log

fi


if [-e $logs/log]; then

	xterm -e nano $logs/log

	rm $logs/log

fi

Myślę, że o takie rozwiązanie Ci chodzi :slight_smile:

EDIT: Poprawiłem lekko skrypt :slight_smile:

Pozdrawiam!


(Krzkaczor) #7

Dzięki za rady, obecnie skrypt wygląda tak, i nadal nie działa:

#!/bin/bash 

FILE="/var/log/upgrades.log"

STATUS=`aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

echo $STATUS > $FILE

#if [$STATUS != '']; then

#	echo "asdasd" > $FILE

#else

#	echo "NOTHING" > $FILE

#fi

Zakomentowane fragmenty to poprzednia wersja która też nie działa :confused:

Proszę o pomoc i pozdrawiam


(Krzkaczor) #8

Dzięki za rady, obecnie skrypt wygląda tak, i nadal nie działa:

#!/bin/bash 

FILE="/var/log/upgrades.log"

STATUS=`aptitude full-upgrade -s | grep -ow '[0123456789]* packages'`

echo $STATUS > $FILE

#if [$STATUS != '']; then

#	echo "asdasd" > $FILE

#else

#	echo "NOTHING" > $FILE

#fi

Zakomentowane fragmenty to poprzednia wersja która też nie działa :confused:

Proszę o pomoc i pozdrawiam


(Marcin 110) #9

Spróbuj opcji -y dla aptitude. Bez niej, program próbuje być interaktywny i zapyta, czy instalować pakiety (o ile jakieś znalazł).


(roobal) #10

Mój skrypt działa, czemu z niego nie skorzystasz? Dostosuj go sobie do własnych potrzeb. Jeśli chcesz mieć tylko log z informacjami o pakietach, czyli jeśli interesują Ciebie tylko te linie: 0 pakietów aktualizowanych, 0 instalowanych, 0 do usunięcia i 0 nie aktualizowanych.

To możesz to zrobić w ten sposób:

#!/bin/bash


FILE=/var/log/upgrades.log

STATUS=`aptitude full-upgrade -s | awk '{if (NR==6) {print $1}}'`


if [$STATUS != 0]; then

   echo $STATUS > $FILE

else

	echo "NOTHING" > $FILE

fi

Pozdrawiam!


(Krzkaczor) #11

Hmmm i tu Was zdziwię bo i skrypt przedstawiony przez roobala nie działa :confused: Tak to wygląda:

#!/bin/bash

echo "1"

FILE=/var/log/upgrades.log

echo "2"

STATUS=`aptitude full-upgrade -sy | awk '{if (NR==6) {print $1}}'`

echo "3"

if [$STATUS != 0]; then

   echo $STATUS > $FILE

else

   echo "NOTHING" > $FILE

fi

echo "4"

Wypisuje tylko 1, i 2.

Skrypt ma za zadanie tylko poinformować mnie o nowych aktualizacjach - nie instalowanie ich.

Proszę o pomoc i pozdrawiam


(dragonn) #12

Ja się zastawiam dlaczego nie skorzystasz z :

aptitude search "~U"

Jeżeli chcesz mieć liczbę to zrób:

aptitude search "~U" | wc -l

(Krzkaczor) #13

Heh, działa :smiley: Wielkie dzięki!