Ćwiczenie 1. Napisz skrypt, w który wyświetla wszystkie swoje argumenty w odwrotnej kolejności.
Przykład:
bash $ ./skrypt.sh ALA ma kota
kota ma ALA
Podpowiedź: można to zrobić dodając poszczególne argumenty do zmiennej, a potem wyświetlić tą zmienną. Należy wykonać to w pętli, najlepiej for, a jeżeli ktoś wybierze pętlę while to może się przydać polecenie shift.
Ćwiczenie 2. Napisz skrypt, w którym użytkownik podaje numer argumentu, który ma być wyświetlony na ekranie, a następnie wyświetlamy ten argument.
Przykład:
bash $ ./skrypt.sh ALA ma kota
Podaj numer argumentu: 3
kota
Podpowiedź: można to zrobić z wykorzystaniem pętli for w której jest umieszczony if, który określa numer argumentu który zostanie wyświetlony.
Sprytniejszy sposób zrobienia tego zadania to wykorzystanie polecenia shift z odpowiednim argumentem. Proszę sprawdzić jakie argumenty pobiera shift i to wykorzystać.
Ćwiczenie 3. Napisz skrypt, który policzy liczbę linii w plikach z rozszerzeniem java w wybranym katalogu (podany jako argument skryptu).
Podpowiedź: można to zrobić samym poleceniem wc, ale trzeba uważać na potencjalne błędy. Polecenie wc można wywołać dla wielu plików i wtedy ono policzy liczbę linii, znaków i słów w każdym pliku z osobna plus podsumowanie.
Bezpieczniejsze rozwiązaniem, to zanurzenie polecenia wc w pętli for. Pętla for przechodzi po wszystkich plikach, a następnie polecenie wc jest wywoływane dla każdego z osobna, coś jak poniżej:
for PLIK in $(.......) ; do
wc ............
done
Ćwiczenie 4. Napisz skrypt, który zapisze do pliku środkowe linie z wszystkich plików z bieżącego katalogu.
Podpowiedź: To zadanie, przypomina jedno z poprzednich. Składa się z dwóch części:
1) musimy umieć wyświetlić linię środkową z zadanego pliku (można policzyć ile mamy linii w zadanym pliku, nastepnie wyznaczamy numer środkowej, następnie wykorzystać numer środkowej w kombinacji poleceń head i tail dzięki której będziemy mogli wyświetlić tę linię, którą właściwie chcemy)
2) musimy umieć przejść po wszystkich plikach z zadanego katalogu (to można zrobić podobnie jak zadanie poprzednie)
Ćwiczenie 5. Napisz skrypt, który wyświetli silnie z liczby a. , która jest wprowadzona z klawiatury. Liczba a musi być dodatnia.
Podpowiedź: zwykła pętla for, np.:
for (( i=1; i < ... ; i++)) ; do
...
done
Ćwiczenie 6. Napisz skrypt, który wyświetli wszystkie silnie od liczby a do liczby b. Liczby a, b muszą być dodatnie.
Podpowiedź: dwie zwykłe pętle for, np.:
for (( i=1; i < ... ; i++)) ; do
...
done
Można wykorzystać podprogramy - zalecane rozwiązanie
Ćwiczenie 7. Napisz skrypt, który sprawdzi, czy podany argument jest nazwą katalogu i jak tak to go wyświetli wraz ze wszystkimi podkatalogami i policzy rozmiar jego rozmiar w bajtach. Dodatkowo, nazwy wszystkich plików lub katalogów z ustawionym atrybutem wykonywania dla właściciela powinny zostać zapisane do pliku o nazwie, która zostanie podana jako drugi argument. Jeżeli drugiego argumentu nie ma to skrypt ma nic nie robić.
Przydatne funkcje: expr, while, read, >, <, test, set
Ćwiczenie 8. Mamy plik o zawartości jak poniżej:
100 300
20 10
11 0
55
11 11a11
333 3
Każda linia zawsze składa się z dwóch kolumn. W każdej kolumnie mamy dwa teksty oddzielone spacją. Napisz skrypt, który pobierze nazwę takiego pliku i wykona operacje matematyczne (+-*/) na kolejnych parach liczb odczytanych z naszego pliku. Wyniki mają zostać zapisane do pliku, którego nazwa jest przekazana jako drugi parametr i dodatkowo wyświetlone na ekran. Trzeba wyświetlić informacje o błędach - dlaczego zadanej linii nie możemy przetworzyć, o ile taka sytuacja wystąpiła.
Ćwiczenie 9. Mamy plik jak poniżej:
1 2 3 4 5
4 3 2 3 4 5 4 3
2 2 2 2 22 3 34 4 4 5 5 5
d 3 43 54 5 3
Napisz skrypt, który pobierze nazwę takiego pliku jako pierwszy argument i wyznaczy sumę (opcja -s) tych liczb i/lub iloczyn (opcja -i) tych liczb.
Przydatne funkcje: for, while, printf
Ćwiczenie 10. Napisz skrypt, który wyświetli tabelkę jak poniżej:
1 2 3 4 5 6 7 8 9 10 11 12
2 4 6 8 10 12 14 16 18 20 22 24
3 6 9 12 15 18 21 24 27 30 33 36
4 8 12 16 20 24 28 32 36 40 44 48
5 10 15 20 25 30 35 40 45 50 55 60
6 12 18 24 30 36 42 48 54 60 66 72
7 14 21 28 35 42 49 56 63 70 77 84
8 16 24 32 40 48 56 64 72 80 88 96
9 18 27 36 45 54 63 72 81 90 99 108
10 20 30 40 50 60 70 80 90 100 110 120
11 22 33 44 55 66 77 88 99 110 121 132
12 24 36 48 60 72 84 96 108 120 132 144
Helpik
test
-z string True if the length of string is zero.
-n string True if the length of string is non-zero.
STRINGS CMP string1 = string2
True if the strings are equal.
string1 != string2
True if the strings are not equal.
! expr True if expr is false.
expr1 -a expr2 True if both expr1 AND expr2 are true.
expr1 -o expr2 True if either expr1 OR expr2 is true.
NUMBERS CMP arg1 OP arg2
OP is: -eq, -ne, -lt, -le, -gt, -ge.
These arithmetic binary operators return true if arg1 is equal, not-equal, less-than, less-than-or-equal, greater-than, or greater-than-or-equal than arg2, respectively. Arg1 and arg2 may be positive integers, negative integers, or the special expression -l string, which evaluates to the length of string.
File operators
-b FILE exists and is block special
-c FILE
FILE exists and is character special
-d FILE
FILE exists and is a directory
-e FILE
FILE exists
-f FILE
FILE exists and is a regular file
-g FILE
FILE exists and is set-group-ID
-G FILE
FILE exists and is owned by the effective group ID
-h FILE
FILE exists and is a symbolic link (same as -L)
-k FILE
FILE exists and has its sticky bit set
-L FILE
FILE exists and is a symbolic link (same as -h)
-O FILE
FILE exists and is owned by the effective user ID
-p FILE
FILE exists and is a named pipe
-r FILE
FILE exists and read permission is granted
-s FILE
FILE exists and has a size greater than zero
-t FD file descriptor FD is opened on a terminal
-u FILE
FILE exists and its set-user-ID bit is set
-w FILE
FILE exists and write permission is granted
-x FILE
FILE exists and execute (or search) permission is granted
Dodatkowe, aczkolwiek bardzo ważne “elementy”, bez których praktycznie żaden skrypt nie byłby w stanie istnieć względnie działać J
$0, $1, $2, $3, …., $#, $@, $*, $?, >, >>, 2>, 2>>, <, /dev/null
Różnica między $@ i $*
echo $@
for i in $@;
do
echo $i
done
echo ---------------------
echo $*
for i in $*;
do
echo $i
done
echo ---------------------
echo $@
for i in "$@";
do
echo $i
done
echo ---------------------
echo $*
for i in "$*";
do
echo $i
done
Polecenie shift
echo $1 $2 $3 $4 $5 $6
shift
echo $1 $2 $3 $4 $5 $6
shift 2
echo $1 $2 $3 $4 $5 $6
#Pętla for po liczbach od 3 do 10
#!/bin/bash
for i in seq 3 10;
do
echo $i
done
for i in 'seq 3 10';
do
echo $i
done
for i in $(seq 3 10);
do
echo $i
done
for i in `seq 3 10`;
do
echo $i
done
#Pętla for po plikach tekstowych
#!/bin/bash
for i in *.txt
do
cat "$i" | wc -l
done
#lub bez pętli ale inaczej to zadziała
cat *.txt | wc -l
#Pętla for po plikach z roszerzeniem sh rozpoczynającysh się na s
#!/bin/bash
for i in `ls *.sh | grep "^s"`
do
tail -5 "$i"
head -20 "$i"
tail -5 "$i" | head -1
done
#Pętla while
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo "The counter is $COUNTER"
let COUNTER=COUNTER+1
done
#Pętla until
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo "COUNTER = $COUNTER"
let COUNTER-=1
done
#Znajoma pętla for
#!/bin/bash
read N
((N++))
for((k=1; k<=N; k++)) ;
do
for((i=1; i<=k; i++)) ;
do
...
done
done
#Odczyt linia po linii z pliku - przykład niepoprawny
#!/bin/bash
LICZBA_ZNAKOW=0
PLIK="ala.txt"
cat "$PLIK" | while read LINIA
do
LICZBA_ZNAKOW_W_LINII=`echo -n $LINIA | wc -c`
let LICZBA_ZNAKOW=LICZBA_ZNAKOW+LICZBA_ZNAKOW_W_LINII
done
echo "Liczba znakow w pliku $PLIK = $LICZBA_ZNAKOW"
#Odczyt linia po linii z pliku
#!/bin/bash
LICZBA_ZNAKOW=0
NAZWA_PLIKU="ala.txt"
while read LINIA
do
LICZBA_ZNAKOW_W_LINII=`echo -n $LINIA | wc -c`
let LICZBA_ZNAKOW=LICZBA_ZNAKOW+LICZBA_ZNAKOW_W_LINII
done < "$NAZWA_PLIKU"
echo "Liczba znakow w pliku $PLIK = $LICZBA_ZNAKOW"
Mamy plik o strukturze:
12 34 56
23 45 45 45
45 4 526 7 3 66 433
8 6 44 3 2
Jego nazwa jest pierwszym argumentem poniższego skryptu:
#!/bin/bash
PLIK=$1
SUMA=0
IFS=$'\n' for LINIA in $(cat $PLIK) ; do SUMA=0 IFS=$' \t\n' for LICZBA in $(echo $LINIA) ; do let SUMA+=LICZBA done echo Suma liczb z linii $LINIA = $SUMA done
#ot ciekawostka, podmiana argumentów
#!/bin/bash
LINIA="10 20"
set $LINIA
expr $1 + $2
expr $1 \* $2
Ot tak na dodatek:
#Wyświetlanie argumentów od końca
for A in `echo $@ | rev` ; do
echo -n $A | rev
echo -n " "
done
echo
for((i=$#; i>0 ; i--)) ; do
echo -n ${!i}" "
done
echo
() - wywołanie podpowłoki
Przykład:
(
echo Ala
echo Ola
) > plik
(()) - wyrażenia arytmetyczne
Przykład:
((M++))
$(()) - wyrażenia arytmetyczne
Przykład:
W=$((M%2))
$[] - wyrażenia arytmetyczne
Przykład:
N=$[M+1]
$() luv ` `- wywołanie polecenia
Przykład:
W=$(ls|wc -l)
W=`ls|wc -l`
[] - polecenie tes - warunek
Przykład:
if [ $1 -gt $2 -a $1 -gt $3 ]
if [ $1 -gt $2 ] && [ $1 -gt $3 ]