BASH zadania z kolokwium

0

Hejcia, przede mną i całą moją grupą 3 podejście do kolokwium zaliczającego Systemy Operacyjne i mamy problem ze skryptami w bashu. Otóż mamy zadania które za 1 razem teoretycznie zrobiliśmy ale nie były one tak jak prowadzący chciał i pokazał nam na dyżurze jak one powinny wyglądać ale jak przelałam do siebie te jego wypociny (XD) to i tak niekoniecznie to dobrze działa, mimo że próbowałam naprawić. Mam nadzieję, że jest tu ktoś kto jest w stanie mi pomóc :)

1. Wypisz imię nazwisko, każdego studenta piszącego z Tobą kolokwium oraz liczbę użytkowników, niekoniecznie zalogowanych, o tym samym imieniu.

#!/bin/bash

who | grep .188\\.146\\.163 | cut -f1 -d " " | uniq | while read login //ip do zmiany
do
	grep -a ^$login: /etc/passwd | cut -f5 -d: 
	imie = " $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d " " ))   //tu wywala blad
	grep $imie /etc/passwd | wc -l

done

2. Napisz skrypt, który wywołany w argumentem oznaczającym liczbę sekund zatrzyma sesję na ten właśnie czas (przez polecenie sleep), a potem wypisze nazwy plików, które tym czasie zostały usunięte z Twojego katalogu domowego (i jego podkatalogów). Przed wykonaniem i po wykonaniu polecenia sleep użyj polecenia date do wypisania aktualnego czasu.

#!/bin/bash

date
find ~ -type f > przed
sleep $1
date
cat przed | while read f
do
	if [-f $f]  //cos tu nie halo
	then 
		echo $f
	fi
done

cat przed

3. Dla PID podanego jako argument podaj listę procesów dla których jest on przodkiem.

#!/bin/bash

ps --ppid $$ -o pid
dz = $()
while [ -n "$dz" ]
do
	echo $dz
	dz2 = ""
	for dziecko in $dz
	do
		dz2 = "$dz2" $(ps --ppid $dziecko)
	done

	dz = "$dz2"
done
1
imie = " $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d " " ))   //tu wywala blad
dz = $()
dz2 = ""
dz = "$dz2"

Rozumiem pobudki estetyczne, jednakże tutaj spacje zmieniają znaczenie wyrażenia. Aby przypisać coś do zmiennej, nie możesz używać spacji wokół znaku =. Tylko taka forma jest poprawna.

if [-f $f]  //cos tu nie halo

Ponownie, spacje są istotne. Przy pisaniu warunków w skryptach, musisz mieć spacje przed i po [ oraz przed ] (dotyczy także bashowych [[ warunków ]]).

imie = " $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d " " ))   //tu wywala blad

Nie uciekasz cudzysłowów w środku stringa, w związku z czym wyrażenie jest interpretowane jako:

  1. imie
  2. =
  3. $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d
  4. )) string niezamknięty

Użyj \", aby umieścić cudzysłów w stringu, albo po prostu zapisz "wewnętrzny" string w apostrofach, zamiast cudzysłowach. Poza tym, masz nieparzystą liczbę cudzysłowów - brakuje zamykającego.

0
Sensacyjny Sebastian napisał(a):
imie = " $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d " " ))   //tu wywala blad
dz = $()
dz2 = ""
dz = "$dz2"

Rozumiem pobudki estetyczne, jednakże tutaj spacje zmieniają znaczenie wyrażenia. Aby przypisać coś do zmiennej, nie możesz używać spacji wokół znaku =. Tylko taka forma jest poprawna.

if [-f $f]  //cos tu nie halo

Ponownie, spacje są istotne. Przy pisaniu warunków w skryptach, musisz mieć spacje przed i po [ oraz przed ] (dotyczy także bashowych [[ warunków ]]).

imie = " $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d " " ))   //tu wywala blad

Nie uciekasz cudzysłowów w środku stringa, w związku z czym wyrażenie jest interpretowane jako:

  1. imie
  2. =
  3. $(( grep ^_$user: /etc/passwd | cut -f5 -d: | cut -f1 -d
  4. )) string niezamknięty

Użyj \", aby umieścić cudzysłów w stringu, albo po prostu zapisz "wewnętrzny" string w apostrofach, zamiast cudzysłowach. Poza tym, masz nieparzystą liczbę cudzysłowów - brakuje zamykającego.

Dziękuję!!! ♥ O tych spacjach to muszę sobie zapisać gdzieś w widocznym miejscu, bo jak zawsze zapominam...

1

Dla 2) proponuję rozwiązanie oparte o find + diff. Nie trzeba tak bardzo męczyć dysków ;)

find $HOME -type f | sort > snapshot1.txt - wyszuka pliki w katalogu domowym użytkownika i zapisze w snapshot1.txt, dzięki temu możesz zapisać do snapshot1.txt stan plików przed sleepem, zaś w snapshot2.txt stan plików po sleepie.

Za pomocą komendy diff snapshot1.txt snapshot2.txt możesz uzyskać informację o tym co się pojawiło, a co zniknęło.

0
yarel napisał(a):

Dla 2) proponuję rozwiązanie oparte o find + diff. Nie trzeba tak bardzo męczyć dysków ;)

find $HOME -type f | sort > snapshot1.txt - wyszuka pliki w katalogu domowym użytkownika i zapisze w snapshot1.txt, dzięki temu możesz zapisać do snapshot1.txt stan plików przed sleepem, zaś w snapshot2.txt stan plików po sleepie.

Za pomocą komendy diff snapshot1.txt snapshot2.txt możesz uzyskać informację o tym co się pojawiło, a co zniknęło.

dokładnie tak większość osób zrobiła za 1. i za 2. razem a prowadzący powiedział tylko "ale nie o to mi chodziło" i nie zaliczał, mimo że działało... :(

1 użytkowników online, w tym zalogowanych: 0, gości: 1