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]$