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!

5 komentarzy:

  1. Ja miałam coś takiego w tym skrypcie? o0 Mi pomógł Bartek też, na podstawie kogoś innego... Więc to nie tylko moje rozwiązanie. BTW. wiesz, co mógłbyś zrobić? KOMENTOWAĆ te skrypty i to obficie, np. wyjaśnij o co biega w linijce: "echo "$@" > "$0>$#"" - pamiętasz, jak sami mieliśmy z tym problem?

    OdpowiedzUsuń na zawsze
  2. Ok, jak znajdę chwilkę to dokomentuję.

    OdpowiedzUsuń na zawsze
  3. W zadaniu 6 trzeba jeszcze wyświetlić wszystkie litery alfabetu: "echo ${alfabet[*]}" i ilość liter alfabetu(czyli ilość zmiennych w tablicy): "echo ${#alfabet[*]}"
    Nie wiem jak wam ale mi 10 zadanie wychodziło tylko wtedy gdy dodałem do polecenia expr "length" np. expr length "podstawy". Samo expr dawało mi wynik 0.(Robiłem to na uczelnianym serwerze czyli ubuntu).

    OdpowiedzUsuń na zawsze
  4. Już poprawione. Dziękuję za spostrzegawczość. Oczywiście uwzględniono autora zmian ;-)

    OdpowiedzUsuń na zawsze
  5. Całkiem ciekawy ten blog. Będę polecał go dalej! :)

    OdpowiedzUsuń na zawsze