sobota, 18 grudnia 2010

BASH - Laboratorium 3

Ostatnie laboratorium dotyczyło uruchamiania programów z parametrami, oraz wszelkich zabaw z nimi razem wziętymi. Było też co nieco o tablicach oraz różnorakich działaniach algebraicznych. Z góry przepraszam za lekkie opóźnienie. W szczegóły przyczyny nie wnikajmy. Powiedzmy że tak miało być i tyle. Przejdźmy zatem do rzeczy.

EDIT: Przygotowałem  tutaj małą ściągawkę, aby łatwiej można było zrozumieć materiał.

$0 - zerowy parametr, pokazuje nazwę skryptu, oraz powłokę z której korzysta.
$1 $2 ... $9 - parametry programu od 1 do 9.
$@ - wypisuje wszystkie parametry programu.
$# - wypisuje ilość wszystkich parametrów programu.
$$ - PID programu (Process ID): to taki numer identyfikacyjny.
$? - wykonuje ponownie ostatnie polecenie.

Przyznaję że sam zanim zrozumiałem na czym polega używanie parametrów, to trochę się pomęczyłem. Aby ułatwić sobie zrozumienie proponuję zrobić przykładowy skrypt wymyślone przeze mnie.


#!/bin/bash
echo "Twoj pierwszy parametr to $1"
echo "Twoj drugi parametr to $2"
echo "Twoj trzeci parametr to $3"
echo "Wszystkie parametry to $@" #zamiast pisać 3 powyższe linijki
echo "Liczba wszystkich parametrow to $#"
echo "Natomiast nazwa skryptu to $0"

Zapisujemy to jako skrypt. Nadajemy odpowiednie uprawnienia. Następnie uruchamiamy zwyczajnie jako ./skrypt, a potem jako ./skrypt 1 2 3 (to poza nazwą skryptu, to są właśnie parametry). Obserwujemy różnicę w działaniu i już wiemy co jest skąd :) Poniższe zadania to rozmaite kombinacje powyższego rozwiązania.



Zadanie 1:
Napisz skrypt wyświetlający : nazwę skryptu oraz pierwszy argument swojego wywołania

#!/bin/bash
echo "$0" #nazwa skryptu oraz powłoka z której korzysta
echo "$1" #pierwszy parametr skryptu



Zadanie 2:
Napisać taki skrypt, którego parametr będzie nazwa pliku, w którym umieszczona zostanie ścieżka
dostępu do shella. Otrzymanemu plikowi należy nadać prawa wykonawcze. UWAGA:W ten sposób utworzony zostanie szablon do tworzenia kolejnych skryptów.

#!/bin/bash
echo "#!/bin/bash" > $1 #ścieżka do shella > nazwa pliku 
chmod 777 $1 






Zadanie 3:
Napisz skrypt, który zapisze wszystkie swoje parametry wywołania w pliku o nazwie mającej
postać nazwa_skryptu_liczba_parametrów

#!/bin/bash
echo "$@" > "$0_$#"
#wszystkie parametry > naz._skr._l_param. 


Zadanie 4:
Napisz skrypt przyjmujący cztery parametry. Skrypt powinien utworzyć trzy pliki, których nazwy
podano w pierwszych trzech parametrach o rozszerzeniu podanym w ostatnim parametrze.

#!/bin/bash
touch $1.$4 #nazwa=$1.rozszerzenie=$4
touch $2.$4 #nazwa=$2.rozszerzenie=$4
touch $3.$4 #nazwa=$3.rozszerzenie=$4


Zadanie 5:
Napisz skrypt, który utworzy plik z połączenia dwóch plików o nazwach podanych w argumentach jego wywołania. Wewnątrz nowo utworzonego pliku będzie znajdować się zawartość plików podanych jako argumenty wywołania. Na końcu pliku wynikowego skrypt ma umieścić informację z połączenia jakich plików powstał (tj. Plik powstał z połączenia plików nazwa_plku1 nazwa_pliku2. Nazwa tego pliku powinna mieć postać nazwa_plku1_nazwa_pliku2.

#!/bin/bash
cat $1 $2 > $1_$2
echo "Plik $1_$2 powstal z polaczenia $1 i $2" >> $1_$2


Zadanie 6:
Napisz skrypt, który przyjmuje jeden parametr – liczbę n i wypisuje na ekranie wszystkie litery alfabetu , ich liczbę oraz n-tą literę alfabetu.

#!/bin/bash
#Definicja tablicy
alfabet=(0 a b c d e f g h i j k l m n o p q r s t u v w x y z)
#n parametr
echo "Znak numer $1 to ${alfabet[$1]}"
#Dodane dzięki czujności michalaV8 ;)
echo "Wszystkie litery alfabetu to ${alfabet[*]}"
echo "Ilosc wszystkich liter to ${#alfabet[*]}"

Zadanie 7:
Prosty kalkulator. Napisać skrypt, który będzie wywoływany z 2 argumentami liczbowymi. Następnie kolejno będą wykonywane operacje arytmetyczne : +, -, / i *.

#!/bin/bash
echo "Wynik dodawania $1+$2 to: $(($1+$2)) "
echo "Wynik odejmowania $1-$2  to: $(($1-$2)) "
echo "Wynik dzielenia $1/$2 to: $(($1/$2)) "
echo "Wynik mnozenia $1*$2 to : $(($1*$2)) "


Zadanie 8:
Napisać skrypt, który wylicza pole i obwód: kwadratu przy użyciu polecenia let. Jako wynik końcowy powinien pojawić się napis ( gdzie ... - otrzymana wartość):
Pole kwadratu wynosi ...
Obwód kwadratu wynosi ...

#!/bin/bash
let  pole=$1*$1
let  obwod=$1*4
echo "Pole kwadratu wynosi $pole"
echo "Obwód kwadratu wynosi $obwod"


Zadanie 9:
Napisać taki skrypt, zdefiniowana jest tablica 5-elementowa z następującymi wartościami: 2 4 -3 8 7. Następnie dodać 2 do ostatniego elementu tablicy oraz odjąć 1 od elementu o indeksie trzy. Usunąć element zerowy i dodać nowy jako ostatni element tej tablicy, który jest równy liczbie wszystkich elementów tej tablicy. W wyniku wykonania skryptu ma się pojawić komunikat:
START array=(2 4 -3 8 7)
END array=(4 -3 7 9 4)

#!/bin/bash
x=(2 4 -3 8 7)
echo START array=${x[*]}
x[4]=$[${x[4]}+2]
x[3]=$[${x[3]}-1]
unset x[0]
x[5]=${#x[*]}
echo END array= ${x[*]}


Zadanie 10:
Z linii poleceń sprawdzić z ilu znaków składa się fraza "Podstawy informatyki" oraz pojedyncze
słowo Podstawy. Wynik wyświetlić na ekranie. Użyć polecenia expr.

expr Podstawy+informatyki


Zadanie 11:
Napisz skrypt, który do momentu zakończenia przez użytkownika będzie pobierał 3- cyfrowe ciągi
liczbowe. Następnie wyświetl je oraz ich liczbę.

#Skrypt by Franciszka :D (nie mój ;) )
#!/bin/bash
read -a tablica
echo "Twoj ciag cyfr to ${tablica[*]}"
echo "Ilosc cyfr to ${#tablica[@]}"
echo "Aby zatrzymać Ctrl+C"
./lab_3_zad11
#aby zatrzymać skrypt: ctrl + C

Miłej zabawy!

piątek, 10 grudnia 2010

Lynx - przydatna przeglądarka tekstowa

Chciałbym przedstawić narzędzie z którego to często lubię korzystać. Jest to mianowicie przeglądarka tekstowa Lynx. Mogłoby się wydawać że epoka przeglądarek internetowych tego typu dawno przeminęła. Jednak kto tak myśli jest w błędzie. Warto się pobawić tym chociażby z ciekawości jak wyglądało kiedyś surfowanie po sieci. A dziś po co to? Diabelnie przydatna rzecz przy instalacji systemów typu Arch Linux,  Slackware czy Gentoo (Gdy nie jest jeszcze zainstalowany interfejs graficzny, bo na przykład nie wiemy jak go wpakować. Wtedy szukamy odpowiednich informacji za pomocą lynx.). Dla większości odwiedzających tego bloga jednak ważniejsze jest inne zastosowanie - a mianowicie przeglądanie ściąg na laboratorium z BASH'a. Za grzebanie na necie przy pomocy Firefoksa można dostać po łapach od prowadzącego zajęcia. Korzystanie z lynx przez terminal jest jednak dużo dyskretniejsze. Na naszych wiekowych maszynach tryb tekstowy też jest dużo szybszy. Na większości stanowisk mojej uczelni ta przeglądarka jest zainstalowana. Co z czym się je i jak? Odpalamy przeglądarkę w terminalu poleceniem:

lynx

Najlepiej to zrobić dyskretnie w dodatkowej zakładce terminala:

Shift+Ctrl+T

Pokaże nam się wtedy taki potwór:


Jest to strona startowa naszej cudownej przeglądarki. Cała legenda korzystania z niej umieszczona jest zawsze z dołu ekranu. Warto ją odpalać mając terminal zmaksymalizowany na cały ekran. Oto kilka najważniejszych klawiszy:

g - przejdź do strony (należy pamiętać o prawidłowej składni http://nic.pl)
G - adres aktualnej strony
q - zamknięcie programu
h - pomoc
Delete - historia
strzałki L/P - przeglądanie stron widzianych już od uruchomienia
strzałki G/D - przewijanie zawartości strony
TAB - skakanie po linkach

Należy pamiętać o akceptowaniu ciasteczek gdy to konieczne (można się zdziwić jak wiele ich jest). Zazwyczaj jest to klawisz t lub y. Szczegóły odnajdziemy w instrukcji u dołu ekranu. Jeśli nie mamy go zainstalowanego na domowym desktopie - instalujemy. Przykład dla wszystkich ubunto-podobnych systemów:

sudo apt-get install lynx

Na uczelnianych stanowiskach według regulaminu o instalację należy poprosić administrację. Miłej zabawy!

wtorek, 7 grudnia 2010

BASH - Laboratorium 2

Zamieszczam kolejne zadania z naszego ukochanego laboratorium. Jest to dalszy ciąg działań na katalogach i folderach. Odnajdziemy tutaj już nieco więcej aktywnych elementów. Mam cichą nadzieję, że moje skrypty komuś pomogą.  Miłej zabawy!


Zadanie 1:
Napisz skrypt wyświetlający na ekranie następujące napisy:
- ”Usmiechnij się” (wraz z cudzyslowami)
- ”Usmiechnij się” (wraz z cudzyslowami, ale bez użycia apostrofów)
- ‘Usmiechnij się’ (wraz z apostrofami)
- ‘Usmiechnij się’ (innym sposobem)

#!/bin/bash
echo \"Usmiechnij sie\"
echo '"Usmiechnij sie"'
echo \'Usmiechnij sie\'
echo "'Usmiechnij sie'"


Zadanie 2:
Napisz skrypt, który wyświetli aktualną pełną nazwę dnia tygodnia, miesiąca oraz numer dnia roku w formacie:
Miesiac: nazwa_miesiąca,
Dzień: nazwa_dnia
Nr: nr_dnia

#warto wklepać man date
#to wam wytłumaczy skąd te dziwne symbole
#!/bin/bash
echo "Miesiac: `date +%B`" 
echo "Dzien: `date +%A`"
echo "Nr: `date +%d`"


Zadanie 3:
Napisz skrypt, który w pliku o nazwie ‘wynik’ przechowuje nazwy wszystkich katalogów i plików katalogu domowego użytkownika

#!/bin/bash
ls -la >> wynik


Zadanie 4:
Napisz ‘skryptA’ , który utworzy i uruchomi ‘skryptB’. Utworzy on i uruchomi kolejny skrypt o nazwie ‘skryptC’ , który wyświetli na ekranie tekst: I DO IT!

#!/bin/bash
touch skryptB
chmod 777 skryptB
echo "#!/bin/bash" > skryptB
echo "./skryptC" >> skryptB
touch skrpytC
chmod 777 skryptC
echo "#!/bin/bash" > skryptC
echo "echo "I DO IT"" >> skryptC 
./skryptB

#Rozwiązanie zaproponowane przez Vincero
#!/bin/bash
echo "#!/bin/bash" > skryptB
echo "echo '#!/bin/bash'> skryptC">>skryptB
echo "echo 'echo I DO IT'>>skryptC">>skryptB
echo "chmod +x skryptC" >>skryptB
echo "./skryptC" >>skryptB
chmod +x skryptB
./skryptB


Zadanie 5:
Napisz skrypt tworzący stronę w HTML (np. index.html). Następnie obejrzyj ją w przeglądarce.
<html>
<head><title>tytul strony</title></head>
<body><p align=center><b>moja strona</b></p></body>
</html>

#UWAGA blog nie wyświetla linijka w linijkę
#tak jak powinno być!
#!/bin/bash
echo "Skrypt tworzący stronę HTML"
echo "<html>" > strona.html
echo "<head><title>tytul strony</title>" >> strona.html
echo "</head>" >> strona.html
echo "<body><p align=center><b>moja strona</b></p>" >> strona.html
echo "</body>" >> strona.html
echo "</html>" >> strona.html


Zadanie 6:
Napisz skrypt, który wczytuje imię i nazwisko użytkownika z klawiatury

#!/bin/bash
echo "Skrypt wczytujący imię i nazwisko"
echo "Wpisz swoje imie:"
read imie
echo "wpisz swoje nazwisko:"
read nazwisko
echo "Twoje imie to: $imie"
echo "Twoje nazwisko to: $nazwisko"


#Można to też rozwiązać w inny sposób.
#Sposób wymyślony przez kolegę Krzysztofa :D
#!/bin/bash
echo "Podaj imie i nazwisko"
read imie nazwisko
echo $imie $nazwisko


Zadanie 7:
Utwórz następujący alias:
- wyświetlający zawartość katalogu wraz z plikami ukrytymi
- pozwalający na usuwanie katalogów wraz z zawartymi w nich plikami
- usuń zdefiniowane aliasy

#UWAGA!
#Na niektórych uczelnianych kompach zmiana
#aliasów nie zadziałała
#!/bin/bash
alias katalog=`ls -la`
alias usun=`rm /katalog/*`
alias usunalias=`unalias=`*``


Zadanie 8:
Napisz taki skrypt z użyciem zmiennych programowych (=samodzielnie zdefiniowanych przez użytkownika), który pozwala na wyświetlenie aktualnej daty oraz pełną nazwę ścieżki. Na ekranie ma się pojawić komunikat:
Znajduję się w katalogu nazwa o godzinie czas.
Nazwa - nazwa katalogu
Czas – bieżąca godzina

#!/bin/bash
#Nasze położenie
A=`pwd`
#Nasz czas
B=`date +%r`
echo "Znajduje sie w katalogu $A o godzinie $B"

niedziela, 5 grudnia 2010

BASH - Laboratorium 1

Zamieszczam tutaj rozwiązania z laboratorium. Programujemy w BASH'u. Może komuś się przydadzą te materiały. W miarę możliwości postaram się wyprzedzać nasze zajęcia.

Zadanie 1:
Sprawdzić różnicę między poleceniem man i apropos.

#Man jest poleceniem wywołującym plik pomocy danego #programu
#Przykład działania:
#man date
Zadanie 2:
Znajdź położenie swojego katalogu osobistego.


#Położenie swojego katalogu osobistego uzyskamy za pomocą #polecenia pwd
#pwd
#Wynik:
#/home/m/akowalski


Zadanie 3:
Stworzyć spis zawartości swojego katalogu osobistego. Następnie odczytać prawa dostępu, rozmiar, właściciela, datę i czas ostatniej modyfikacji oraz nazwę każdego pliku.


#Szczegółowy spis zawartości uzyskujemy przez wpisanie ls -la

Zadanie 4:
Obejrzeć zawartość katalogu nadrzędnego.

#Zawartość katalogu nadrzędnego przejrzymy
# ls -la /../

Zadanie 5:
a) Założyć katalogi: b1, b2
b) Następnie w katalogu b1 utworzyć kilka plików (np. sala1, sala2, sala22, sala23, sala220) przy
pomocy: polecenia touch oraz edytorów: pico, vi, vim
c) Sprawdzić zawartość katalogu
d) Przekopiować wszystkie pliki z katalogu b1 do katalogu b2 (wg poniższych sposobów)
- wykonać kopiowanie z poziomu katalogu nadrzędnego (..); usunąć pliki w katalogu b2)
- wykonać z poziomu katalogu bieżącego (z b1); usunąć pliki w katalogu b2)
e) Przenieść wszystkie pliki z katalogu b1 do katalogu b2
- z poziomu katalogu nadrzędnego (..)
- poziomu katalogu bieżącego (z b1)
f) Przenieść pliki z katalogu b2, zaczynające się na literę ‘s’ i których 5 i 6 znak równy jest liczbie 2 do katalogu b1
g) Stwórz w katalogu osobistym następujące pliki: aaa2, aa1, ala, as1, a2a, b01, bb2, bbb3

#a)Zakładamy katalogi: b1 i b2
#mkdir b1 b2
#b)
#cd ~/b1
#touch sala1 sala2 sala22 sala23 sala220
#c)
#ls ~/b1
#d)
#cp /../* /b2
#rm /b2/*
#cp * /b2
#e)
#mv ~/b1/* ~/b2
#mv ~/../* ~/b2
#f)
#mv ~/b2/s???22 ~/b1
#g)
#touch aaa2 aa1 ala as1 a2a b01 bb2 bbb3

Zadanie 6:
Nadaj odpowiednie prawa dostępu plikom w katalogu b2:
- nadaj wszystkim oraz grupie prawa do zapisu i odczytu, a właścicielowi dodatkowe prawo do
wykonania
- usuń wszystkim, grupie oraz właścicielowi prawa do czytania

#chmod 766 ~/b2/*
#chmod 322 ~/b2/*

Zadanie 7:
Napisz taki skrypt, który tworzy (w katalogu osobistym) katalog o nazwie Tmp, a następnie
przeniesie wszystkie pliki o trzyliterowych nazwach, zaczynające się na literkę a, znajdujące się w katalogu bieżącym do katalogu Tmp. Po zakończeniu tych czynności skrypt powinien wyświetlić informację tekstową KONIEC.

#!/bin/bash
mkdir ~/Tmp
mv a?? ~/Tmp
echo "KONIEC"

Zadanie 8:
Napisz skrypt, który plikom z katalogu bieżącego nada prawa dostępu w następujący sposób:
- jeśli nazwa pliku zaczyna się literą a – właściciel i grupa otrzymują prawo do czytania i pisania, pozostali użytkownicy tylko prawo do odczytu;
- jeśli nazwa pliku zaczyna się literka b – właściciel otrzymuje pełne prawa, grupa – czytanie i
wykonanie, a pozostali – tylko odczyt;
- jeśli nazwa rozpoczyna się inna literka niż wymienione powyżej – tylko właściciel otrzymuje
prawa, są to prawa do odczytu i zapisu;

#!/bin/bash
chmod 664 ~/a*
chmod 734 ~/b*
chmod 600 ~/~ab
echo "KONIEC WYPASIONEGO SKRYPTU"