Nowe posty

Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Pokaż wątki - www0_0

Strony: [1]
1
Bash, skrypty powłoki / 3 skrypty bash prośba o pomoc
« dnia: 2021-02-22, 00:12:09 »
Witam
Zwracam się do was forumowicze z prośbą o pomoc.
Na zaliczenie kolokwium dostałem takie zadanie:
Cytuj
Zadanie za 2 pkt
Utworzyć skrypt archiwum.sh:

1. Zarchiwizuj wszystkie pliki z drzewa katalogu domowego (/home/nazwa-usera), które zostały
zmodyfikowane w ciągu ostatnich 24 godzin.

2. Plik archiwalny ma być spakowany do tar.gz.
3. Skrypt ma sprawdzać czy jakieś pliki się zmieniły. Jeżeli żadnego nie ma to ma wypisać
komunikat, a jeżeli są to zarchiwizować do pliku.
4. Nazwa pliku archiwalnego ma być zadana przez użytkownika jako parametr skryptu.

Zadanie za 2 pkt
Utworzyć skrypt kosz.sh:

1. Wykonujący kopię pliku przed usunięciem (nie używaj w nazwach * i ?).
2. Skrypt pobierze tylko jeden argument w wierszu poleceń. Wypisuje komunikat o błędzie,
jeśli nie podano żadnego argumentu lub więcej niż jeden argument.
3. Utwórzy katalog .kosz w bieżącym katalogu, jeśli nie został jeszcze utworzony.
4. Skopiuje plik wskazany przez pierwszy argument do .kosz.
5. Usunie podany plik w bieżącym katalogu roboczym.

Zadanie za 1 pkt
Opisać skrypt z załączonego listingu.

1. Napisać do czego służy skrypt i podać 3 przykłady jego wywołania
2. Uzupełnić wszystkie puste polecenia echo wpisując odpowiednie komentarze
3. Dodać komentarz opisujący co się dzieje w blokach (warunkowych, pętlach czy funkcjach)

1 #!/ bin/ bash
2 valid ()
3 {
4 var1 ="$1"; var2 ="$2"; var3 ="$3"
5
6 if [ -z $var1 ] ; then
7 echo " " >&2 ; return 1
8 fi
9
10 if [ "${ var1 %${ var1 #?}} " = "-" ] ; then
11 test ="${ var1 #?} "
12 else
13 test =" $var1 "
14 fi
15
16 result ="$( echo $test | sed ’s /[[: digit :]]//g ’)"
17
18 if [ ! -z $result ] ; then
19 echo " " >&2
20 return 1
21 fi
22
23 if [ ! -z $var2 ] ; then
24 if [ " $var1 " - lt " $var2 " ] ; then
25 echo "" >&2
26 return 1
27 fi
28 fi
29
30 if [ ! -z $var3 ] ; then
31 if [ " $var1 " - gt " $var3 " ] ; then
32 echo " " >&2
33 return 1
34 fi
35 fi
36
37 return 0
38 }
39
40 if valid "$1" "$2" "$3" ; then
41 echo " "
42 fi

I teraz tak po kilku godzinach udało mi się stworzyć w pełni działający skrypt kosz.sh
w skrypcie archiwum.sh udało mi sie opanować rzeczy zaznaczone podkreśleniem, jednak napotkałem pewne problemy dalej.
Spróbowałem skrypt napisać w taki sposób:
#!/bin/bash
# archiwum
a=$1
zmienna=$#
if [ $zmienna = 1 ]
    then
    if [ -e $a.tar.gz ] ; then #Sprawdzam czy istnieje archiwum z nazwą podaną w parametrze
         echo "Archiwum $a.tar.gz istnieje "
          mkdir aktualne #tworze katalog aktualne na potrzeby skryptu
          find /home/user -type f -mtime -1 -exec mv {} ~/aktualne \; #Wyszukuje pliki w katalogu domowym które w ostatnich 24 godzina były modyfikowane a następnie przenosze je do katologu aktualne
          tar -uvf $a.tar.gz aktualne #pakuje katalog aktualne do arhiwum tar.gz o nazwie parametru
          find /home/user/aktualne -type f -mtime -1 -exec mv {} ~ \;#Przenosze pliki z powrotem do katalogu domowego
          rm -rf aktualne #usuwam katalog aktualne stworzony na potrzeby skryptu.
    else
        echo "Tworze nowe archiwum o nazwie $a.tar.gz"
          mkdir aktualne #tworze katalog aktualne na potrzeby skryptu
        find /home/user -type f -mtime -1 -exec mv {} ~/aktualne \; #Wyszukuje pliki w katalogu domowym które w ostatnich 24 godzina były modyfikowane a następnie przenosze je do katologu aktualne
          tar -czvf $a.tar.gz aktualne #pakuje katalog aktualne do arhiwum tar.gz o nazwie parametru
          find /home/user/aktualne -type f -mtime -1 -exec mv {} ~ \;#Przenosze pliki z powrotem do katalogu domowego
          rm -rf aktualne #usuwam katalog aktualne stworzony na potrzeby skryptu.
    fi
    else
    echo "Wywołaj skrypt jeszcze raz podając nazwe archiwum  w pierwszym parametrze."
fi

aby zachować parametr z datą i godziną modyfikacji. Niestety sposób ten wywala wiele błędów. Natomiast jak wykonuje kopiowanie plików to tracę parametr daty, gdyż po skopiowaniu to już są zupełnie nowe pliki z datą i godziną w momencie kopiowania.
Myślę teraz aby wykonać to z koncepcji zapisywania wyników polecenia find do pliku, a następnie pakowania plików odczytując je z pliku. ale nie bardzo wiem jak listę wyników z find przesłać do pliku.

No i w tym trzecim zadaniu już wiem że pierwszy if odpowiada za sprawdzanie czy skrypt odpaliłem z pierwszym parametrem.
natomiast pokonały mnie wyrażenia regularne z lini 10,11 i 16 przez to nie bardzo wiem jak jeszcze można odpalić skrypt i co dokładnie ma robić.
obecnie opanowałem go w takim stopniu:
#!/bin/bash
valid()
{
    var1="$1";       var2="$2";       var3="$3"

    if [ -z $var1 ] ; then #Sprawdzamy czy istnieje pierwszy parametr skryptu
        echo "Skrypt wywołany bez parametrów"  >&2 ; return 1
    fi

    if [ "${var1%${var1#?}}" = "-" ] ; then
        test="${var1#?}"
    else
        test="$var1"
    fi

    result="$(echo  $test | sed ’s/[[:digit:]]//g’)"

    if [ ! -z $result ] ; then
        echo "Odpowiedz po drógim IF "  >&2
        return 1
    fi

    if [ ! -z $var2 ] ; then
        if [ "$var1" -lt "$var2" ] ; then #Porównanie czy parametr 1 jest mniejszy od paramertu 2
        echo "Pierwszy parametr jest mniejszy od drógiego parametru"  >&2
        return 1
        fi
    fi

    if [ ! -z $var3 ] ; then
        if [ "$var1" -gt "$var3" ] ; then # Porównanie czy parametr 1 jest większy od parametru 3
        echo " Odpowiedz po czwartm IF"  >&2
        return 1
        fi
    fi

    return 0
}

if valid "$1" "$2" "$3" ; then
echo "Skrypt zakończył działanie z spełnioną funkcjią valid "
fi

Dziękuje za jakiekolwiek wskazówki które naprowadzą mnie na rozwiązanie moich problemów.

Strony: [1]