Powłoka bash - programowanie.

Transkrypt

Powłoka bash - programowanie.
Powłoka bash - programowanie.
for nazwa [ in słowo ] ; do
lista ;
done
Interpretowane są słowa następujące po in, tworząc listę elementów.
Zmiennej nazwa nadawana jest kolejno wartość każdego elementu tej
listy i każdorazowo wykonywana jest lista poleceń. Jeżeli pominięto
in słowo, to polecenie for wykonuje listę po jednym razie dla każdego ustawionego parametru pozycyjnego. Zwracanym kodem jest
kod zakończenia ostatniego wykonanego polecenia. Jeśli interpretacja elementów następujących po in daje w wyniku pustą listę, to nie
są wykonywane żadne polecenia i zwracany jest kod 0.
Przykład:
for i in *jpg; do convert $i ${i%jpg}gif ; done
for (( wyr1 ; wyr2 ; wyr3 )) ; do
lista ;
done
Na początku obliczane jest wyrażenie arytmetyczne wyr1. Następnie
wielokrotnie obliczane jest wyr2, aż do osiągnięcia przez nie wartości
zero. Każdorazowo gdy obliczone wyr2 jest niezerowe, wykonywana
jest lista i obliczne jest wyrażenie arytmetyczne wyr3. Jeśli pominięto
któreś z wyrażeń, to zachowuje się ono tak, jakby przyjmowało wartość 1. Zwracanym kodem jest kod zakończenia ostatniego wykonanego polecenia listy, lub fałsz jeśli któreś z wyrażeń jest niepoprawne.
Przykład:
for (( j=0 ; j<=10; j++ )); do
for (( i=0; i<=10; i=$[i+1] )); do
echo -n $((i*j)), ;
done;
echo;
done
0,0,0,0,0,0,0,0,0,0,0,
0,1,2,3,4,5,6,7,8,9,10,
0,2,4,6,8,10,12,14,16,18,20,
0,3,6,9,12,15,18,21,24,27,30,
0,4,8,12,16,20,24,28,32,36,40,
0,5,10,15,20,25,30,35,40,45,50,
0,6,12,18,24,30,36,42,48,54,60,
0,7,14,21,28,35,42,49,56,63,70,
0,8,16,24,32,40,48,56,64,72,80,
0,9,18,27,36,45,54,63,72,81,90,
0,10,20,30,40,50,60,70,80,90,100,
select nazwa [ in słowo ] ; do
lista ;
done
Interpretowana jest lista słów następujących po in, tworząc listę elementów. Zestaw zinterpretowanych słów drukowany jest na standardowym wyjściu, każde poprzedzone liczbą kolejną. Jeśli pominięto
in słowo, to drukowane są parametry pozycyjne. Następnie wyświetlana jest zachęta PS3 i czytany jest wiersz ze standardowego wejścia.
Jeżeli wiersz składa się z liczby odpowiadającej jednemu z wyświetlonych słów, to zmiennej nazwa przypisywana jest wartość tego słowa.
Jeśli wiersz jest pusty, słowa i zachęta wyświetlane są ponownie. Jeżeli odczytano EOF, to polecenie kończy pracę. Każda inna wartość
powoduje, że nazwie zostanie przypisany łańcuch pusty. Odczytany
wiersz zachowywany jest w zmiennej REPLY. lista wykonywana jest
po każdym wyborze, dopóki nie zostanie wykonane polecenie break
lub return. Kodem zakończenia select jest kod zakończenia ostatniego wykonanego polecenia listy lub zero jeśli nie wykonano żadnych
poleceń.
Przykład:
PS3=’czego? ’;
select x in Ala Ela Ula ; do
echo Dzisiaj przyjdzie $x;
done
1) Ala
2) Ela
3) Ula
czego? 1
Dzisiaj przyjdzie Ala
czego? 3
Dzisiaj przyjdzie Ula
czego?
case słowo
wzorzec1a
wzorzec2a
wzorzec3a
in
| wzorzec1b ... ) lista1 ;;
| wzorzec2b ... ) lista2 ;;
| wzorzec3b ... ) lista3 ;;
...
esac
Polecenie case najpierw interpretuje słowo i próbuje dopasować uzyskany wynik każdego z wzorców po kolei, posługując się tymi samymi regułami dopasowywania, co dla rozwijania nazw ścieżkowych.
Gdy znalezione zostanie dopasowanie, wykonywana jest odpowiadająca mu lista. Po pierwszym dopasowaniu nie są dokonywane próby
dopasowania pozostałych wzorców. Jeśli żaden ze wzorców nie pasuje do kodem zakończenia jest zero. W przeciwnym razie jest równy
kodowi zakończenia ostatniego z wykonanych poleceń listy.
Przykład:
PS3=hy? ’;
select x in Ala Ela Ula ; do
echo Dzisiaj przyjdzie $x;
done
select x in Ala Ela Ula ; do
case $x in
Ala | Ela ) echo ’Nudziary’ ;;
Ula ) echo ’Yoooohooo!’;;
esac;
done
1) Ala
2) Ela
3) Ula
hy? 1
Nudziary
hy? 2
Nudziary
hy? 3
Yoooohooo!
hy?
if lista; then
polecenia;
elif lista1; then
polecenia1;
elif lista2; then
polecenia2;
...
else
polecenia0;
fi
Wykonywana jest lista występująca po if. Jeżeli jej kod zakończenia
jest zerowy, to wykonywana jest lista klauzuli then. W przeciwnym
wypadku, wykonywana jest lista każdego elif po kolei; jeśli kod zakończenia którejś wynosi 0, to wykonywana jest lista then i polecenie
jest kończone. Jeżeli nie wystąpił żaden z powyższych przypadków, to
wykonywana jest lista występująca po klauzuli else, jeśli takowa istnieje. Kodem zakończenia jest kod ostatniego wykonanego polecenia
listy lub zero jeśli żaden z warunków nie okazał się prawdziwy.
Przykład:
kw () {
read a; read b; read c; d=$[b*b-4*a*c];
if [ $d -lt 0 ]; then echo nic z tego;
elif [ $d -eq 0 ]; then echo JEDEN;
else echo DWA;
fi
}
[drak@drak wyklady]$ kw
1
2
1
JEDEN
[drak@drak wyklady]$ kw
1
1
-1
DWA
[drak@drak wyklady]$ kw
1
1
1
nic z tego
while lista; do lista; done
until lista; do lista; done
Polecenie while powtarza wykonywanie listy podanej po do tak długo,
jak długo ostatnie polecenie listy while zwraca zerowy kod zakończenia. Polecenie until działa identycznie jak while, poza tym, że
warunek jest zanegowany: do lista wykonywane jest tak długo, jak
długo ostatnie polecenie listy until zwraca niezerowy kod zakończenia. Kod zakończenia poleceń while i until jest równy kodowi
zakończenia ostatniego z wykonanych poleceń listy do lub zeru jeśli
żadne nie zostało wykonane.
Przykład:
i=0;
while [ $i -le 5 ]; do
echo doit $i
i=$[i+1]
done
doit
doit
doit
doit
doit
1
2
3
4
5
[drak@drak wyklady]$
[ function ] nazwa () {lista; }
Definuje to funkcję nazwaną nazwa. Ciałem funkcji jest lista poleceń zawarta pomiędzy { i }. Lista ta jest wykonywana w za każdym
razem gdy nazwa występuje jako polecenie proste. Kodem zakończenia funkcji jest kod zakończenia ostatniego z wykonanych poleceń jej
ciała.
Przykład:
dec2bin () {
arg=$1;
bin=""; # laden ?
until [ "$arg" ]; do
bin=$((arg % 2 ))$bin; arg=$((arg/2));
done
echo $bin;
}
[drak@drak
10101
[drak@drak
10000
[drak@drak
1010000
[drak@drak
wyklady]$ dec2bin 21
wyklady]$ dec2bin 16
wyklady]$ dec2bin 80
wyklady]$
hex2bin () {printf "%x\n" $1;}
[drak@drak
14
[drak@drak
78
[drak@drak
64
[drak@drak
a4
[drak@drak
wyklady]$ hex2bin 20
wyklady]$ hex2bin 120
wyklady]$ hex2bin 100
wyklady]$ hex2bin 164
wyklady]$