Nowe posty

Autor Wątek: Problem ze skryptem na 5 maja bardzo zelży mi na czasie błagam pomóżci  (Przeczytany 4205 razy)

RED83

  • Gość
treść zadania:
Napisać skrypt o nazwie „sprawdz.sh”. Skrypt ma pobierać jeden parametr: nazwę użytkownika(należy sprawdzać, czy taki użytkownik istnieje) i wyświetlać informację o historii logowań tego użytkownika (podpowiedź: polecenie „last”). Prezentowana informacja ma mieć następującą formę: daty logowań tego użytkownika oraz liczbę logowań w danym dniu.

męczyłem się i wymyśliłem coś takiego z tym że do dwóch linijek ma obiekcje nie wiem co jest tego przyczyną pomóżcie błagam

#!/bin/bash

if [ $# -eq 1 ]     #jeżeli liczba parametrów wywołania ($#) jest równa (-eq) 1
then
  if [ $(cat /etc/passwd | grep $1) ]  #jeżeli użytkownik podany w pierwszym   parametrze wywołania znajduje się z pliku /etc/passwd
  then
  length=$(($(last $1 | wc -l)-1))  #wyliczenie rzeczywistej ilości wyników z last (by wyciąć stopkę)
  for line in $(last $1 | awk {print $6 ”.” $5}|head –n $length)   #pętla, która w $line ma postać dzień.miesiąc
  do
    if [ -z $data ] #jeżeli $data jest puste przy pierwszym wykonaniu pętli
    then
    data=$line
    fi

    if [ $data = $line ] #jeżeli zapamiętana data jest równa obecnej w pętli
    then
    ilosc_logowan=$($ilosc_logowan+1)  #dodanie ilości logowań tego dnia
    else
      echo $data - $ilosc_logowan logowań #wyświetlenie wyniku dla danego dnia
      data=$line # pobranie nowej daty
      ilosc_logowan=1 #dodanie pierwszego logowania tego dnia
    fi
   done
  else
    echo Użytkownik podany w pierwszym parametrze nie isnieje w systemie
  fi
else
  echo Proszę uruchomić skrypt z jednym parametrem – nazwą użytkownika do sprawdzenia  
fi

ma obiekcje do dwóch poniższych linijek:
 if [ $(cat /etc/passwd | grep $1)
 for line in $(last $1 | awk {print $6 ”.” $5}|head –n $length)

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
1) Wrzuć może treść skryptu w tag CODE, żeby było cokolwiek widać.



2)
> ma obiekcje do dwóch poniższych linijek:
> if [ $(cat /etc/passwd | grep $1) ]

I słusznie, bo to nie jest warunek logiczny.
Możesz albo liczyć linie:
if [ $( cat /etc/passwd | grep $1 | wc -l ) -ge 1 ]; then
albo, sprawdzić, czy "grep" zakończył się bez błędu, co oznacza, że dopasował choć jedną linię. Ale wtedy ani bez polecenia "test" (czyli "[ ]"), ani bez "$()", które pobiera wyjście procesu:
if ( cat /etc/passwd | grep $1 ); then
Poza tym takie grepowanie pliku /etc/passwd nie jest jednoznaczne. Użyj wyrażenia regularnego ("grep -e"), aby mieć pewność, że sprawdzasz nazwę użytkownika, a nie dowolny ciąg znaków w linii (bo może np. dopasować opis użytkownika).



> for line in $(last $1 | awk {print $6 "." $5}|head –n $length)

Jeśli chcesz czytać linie, to raczej w ten sposób:
while read line; do
  [...]   # coś tam z użyciem $line
done < <( last $1 | awk {print $6 "." $5} | head -n $length )
Nie sprawdzałem reszty skryptu. Pokombinuj z tym co napisałem, a jak coś, to pisz.



PS. Nie używaj tych cudzysłowów: „ i ” i dziwnego myślnika –. Są taki ładne standardowe znaki " i - :)

  • Gość
trzeba tylko dorobić warunki if then fi
podajac usera którego nie ma w passwd skrypt nic nie wyświetli
#!/bin/bash

# sprawdzimy czy jest user o podanym loginie
cut /etc/passwd -d ":" -f1 | grep $1

# ile razy logowal sie $1 zaczytamy z last
# usuwamy zbedne spacje od razu zamieniajac je na _
# cut-em odczytajmy sobie daty i posortujmy unikalnie - jedna data w linii
for i in `last | grep $1 | tr -s " " "_" | cut -d "_" -f3-5 | sort -u`
# w $i mamy date np. Fri_May_1
do
# wyswietlmy wynik
echo $1 logowal sie `last | grep $1 | tr -s " " "_" | grep  $i | wc -l` razyw w `echo $i | tr -s "_" " "`
done
przykładowy wynik
mtg@MtG:~$ ./lg.sh mtg
mtg
mtg logowal sie 2 razyw w Fri Apr 10
mtg logowal sie 3 razyw w Fri Apr 17
mtg logowal sie 4 razyw w Fri Apr 24
mtg logowal sie 3 razyw w Fri Apr 3
mtg logowal sie 3 razyw w Fri Feb 20
mtg logowal sie 1 razyw w Fri Feb 27
wada.. wyniki nie są posortowane wg dat, ale takiego warunku w zadaniu nie ma :)