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 IMIE
2. Wyświetl listę zmiennych eksportowanych.
export
lub
export -p
3. 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
done
5. 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
done
6. 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
done
7. 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
done
8. 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
done
9. 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
fi
10. 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"
fi
11. 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"
fi
12. 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
fi
13. 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"
fi
14. 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`
fi
15. 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
fi
16. 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