Linux - skrypty powłoki przykłady
Przykładowe i przydatne skrypty bash.
1. Zdefiniuj zmienną IMIE i przypisz jej swoje imię. Wyświetl zawartość tej zmiennej. Wyeksportuj tą zmienną i sprawdź, czy jest dostępna w nowym (potomnym) interpreterze.
IMIE=Gosia echo $IMIE export IMIE2. Wyświetl listę zmiennych eksportowanych.
exportlub
export -p3. Zmień własny znak zachęty, modyfikując zmienną PS1.
PS1='Nowy znak'4. Napisz skrypt, który dla każdego z plików podanych jako argumenty wywołania posortuje jego zawartość.
#!/bin/bash while [ -f "$1" ] do sort $1 > "sorted.data$1" shift done5. Napisz skrypt, który dla każdego z plików podanych jako argumenty wywołania wyświetli w kolejnych liniach 3 najczęściej powtarzające się w nim słowa.
#!/bin/bash while [ -f "$1" ] do echo "Najczesciej powtarzajace slowa w pliku $1 to:" cat $1 | tr -s ' ' '\n' | sort | uniq -c | sort -r | head -n 3 echo " " shift done6. Napisz skrypt, który będzie kopiował plik podany jako pierwszy argument do wszystkich katalogów podanych jako kolejne argumenty wywołania.
#!/bin/bash if [ ! -f "$1" ] then echo "$1 nie jest plikiem!" break fi zrodlo=$1 while [ -d "$2" ] do cp $zrodlo $2 shift done7. Napisz program, który dla każdego podanego pliku (ścieżki) obliczy (przy pomocy md5sum) jego sumę kontrolną i zapisze ją w pliku o nazwie takiej jak ścieżka + "_md5" w tym samym katalogu co plik.
#!/bin/bash while [ -f "$1" ] do md5sum $1 > ./"$1_md5" shift done8. Napisz skrypt, który przyjmuje za pośrednictwem argumentów wywołania dowolną liczbę nazw katalogów i wypisuje zawartość każdego z tych katalogów. Wypis zawartości kolejnego katalogu powinien być poprzedzony jego nazwą
#!/bin/bash while [ -d "$1" ] do echo "Katalog $1" ls -l $1 shift done9. Napisać skrypt, który wypisuje z pliku passwd znajdującego się w katalogu podanym jako parametr: wszystkich użytkowników o imieniu podanym jako parametr oraz liczbę takich użytkowników.
#!/bin/bash if [ ! -d "$1" ] then echo "$1 nie jest poprawnym katalogiem" else if [ -n "$2" ] then cat "$1/passwd" | grep "$2" echo "Liczba userow o imieniu $2:" cat "$1/passwd" | grep "$2" | wc -l else echo "podaj imie uzytkownika" fi fi10. Napisać skrypt zapisujący zawartości dwóch plików o nazwach podanych jako parametry do trzeciego pliku, którego nazwa również została podana jako parametr.
#!/bin/bash if [ ! -f "$1" -a ! -f "$2" ] then echo "$1 $2 musza byc poprawnymi plikami" else cat "$1" "$2" > "$3" fi11. Napisać skrypt, który wywołany z parametrem będącym nazwą zawodu zapisuje do pliku o nazwie odpowiadającym temu zawodowi (czyli takiej jak podany parametr) imiona, nazwiska i wiek (bez pola zawodu!) wszystkich osób z pliku pracownicy mających ten zawód.
#!/bin/bash if [ -z "$1" ] then echo "Podaj nazwe zawodu" else cat pracownicy.txt | grep "$1" | cut -f1-3 > "$1" fi12. Napisać skrypt, który po podaniu nazwy użytkownika i liczby interesujących nas logowań wyświetla te logowania. Jeżeli podana nazwa użytkownika jest nieprawidłowa, skrypt ma wypisywać komunikat "Nie ma takiego uzytkownika". W skrypcie należy wykorzystać polecenie last.
#!/bin/bash #last -n liczba_logowan if [ -z "$1" -a -z "$2" ] then echo "Podaj nazwe uzytkownika i liczbe logowan" else nazwausera=$1 czyistnieje=`cat /etc/passwd | grep $1 | wc -l` if [ $czyistnieje -eq 0 ] then echo "Nie ma takiego uzytkownika" else last "$1" -n "$2" fi fi13. Napisać skrypt, który sprawdza, czy bieżący katalog zawiera plik o nazwie podanej jako parametr, a jeśli tak - tworzy w katalogu bieżącym katalog kopie_zapasowe (jeśli takiego katalogu jeszcze nie ma), a następnie kopiuje plik do tego katalogu. Jeśli katalog kopie_zapasowe już istniał i zawierał plik o podanej nazwie, kopiowanie następuje tylko wtedy, gdy plik w kopie_zapasowe jest starszy od znalezionego.
#!/bin/bash if [ -f "$1" ] then if [ -d "kopie_zapasowe" ] then if [ -f "kopie_zapasowe/$1" ] then #plik1 -ot plik2 - plik1 jest starszy od pliku plik2 (ang. older than) if [ "kopie_zapasowe/$1" -ot "$1" ] then cp "$1" "kopie_zapasowe" fi fi else mkdir "kopie_zapasowe" cp "$1" "kopie_zapasowe" fi else echo "$1 nie jest poprawnym plikiem" fi14. Napisać skrypt, który policzy podkatalogi katalogu podanego jako parametr.
#!/bin/bash if [ ! -d "$1" ] then echo "$1 nie jest poprawnym katalogiem" else echo "Liczba podkatalogow w katalogu $1 wynosi " `ls -l $1 | grep '^d' | wc -l` fi15. Napisać skrypt, który uruchomiony z dwoma parametrami będącymi nazwami plików policzy linie w tych plikach i powie, który z plików jest dłuższy. Jeśli któryś z plików nie istnieje lub nie podano wystarczającej liczby parametrów, skrypt ma wypisywać odpowiedni komunikat o błędzie.
#!/bin/bash if [ ! -f "$1" -a ! -f "$2" ] then echo "Podaj poprawne nazwy plikow" else linie1=`cat "$1" | wc -l` linie2=`cat "$2" | wc -l` if [ $linie1 -gt $linie2 ] then echo "Plik $1 jest dluzszy" else echo "Plik $2 jest dluzszy" fi fi16. Napisać skrypt konwertujący kodowanie podanego pliku z windowsowego CP1250 do UTF-8 (przydatna funkcja iconv).
#!/bin/bash #man iconv if [ $# -gt 0 ] then iconv -f CP1250 -t UTF-8 --output=/tmp/$1 $1 cp $1 "$1.bak" mv /tmp/$1 $1 else echo "Konwersja kodowania pliku tekstowego z CP1250 (Windows) na UTF-8" echo "użycie: $0 nazwapliku" fi