Logo


Kurs programowania w Bash'u

Nowości       Porady      

Warunki

W języku Shell, tak jak i w wielu innych językach programowania, stosuje się tzw. wyrażenia warunkowe które pozwalaja sterowac działaniem programu.

test

Najkrócej warunek można zapisać w ten sposób

[ $a -eq $b ] && echo "a jest równe b" || echo "Zmienne się różnią"

Czyli: jeśli $a jest równe $b wyświetl komunikat "a jest równe b", w przeciwnym wypadku wyświetl zdanie "Zmienne się różnią".

Wyrażenie w nawiasach kwadratowych jest to warunek testujący używający programu test. Test zwraca kod zakończenia równy 0 gdy warunek został spełniony, w innym przypadku kod zakończenia wynosi 1. Lista dostępnych warunków znajduje się na dole strony oraz w man test.

if-then-fi

if warunek_jest_spelniony
then
polecenie
fi

Wyrażenie to czytamy następująco: Jeżeli warunek jest spełniony wykonaj polecenie.

Skrypt sprawdza czy istnieje plik o nazwie moj_plik
oraz informuje nas, jesli jest to prawdą

#!/bin/bash
if [ -e moj_plik ]
then
echo "Masz plik moj_plik"
fi


Bardzo ważne: nawiasy muszą być odzielone spacją, inaczej nie będzie działać.

-e oznacza - wyrażenie jest prawdziwe, gdy plik o nazwie moj_plik istnieje (exist)

Gdybyśmy chcieli sprawdzić istnienie pliku w swoim katalogu domowym, napisalibyśmy:

if [ -e ~/moj_plik ]

if-then-else-fi

Wyrażenie czytamy następująco: Jeżeli warunek jest spełniony wykonaj polecenie1, jeśli nie jest - wykonaj polecenie2.


if warunek_spelniony
then
polecenie1
else
polecenie2
fi

Skrypt sprawdza czy istnieje plik o nazwie moj_plik
oraz generuje odpowiedni komunikat

#!/bin/bash
if [ -e moj_plik ]
then
echo "Masz plik moj_plik"
else
echo "Nie masz pliku moj_plik"
fi

if-then-elif-else-fi

Tego wyrażenia używamy gdy potrzeba sprawdzić kilka warunków, jednak chodzi nam tylko o spełnienie tylko jednego z nich.

Wyrażenie to sprawdza po kolei, który warunek jest spełniony, jeśli taki znajdzie wykona polecenie mu przyporządkowane. Jeśli nie będzie spełniony żaden z warunków, wykonane zostanie polecenie widoczne po instrukcji else.


if warunek1
then
polecenie1
elif warunek2
polecenie2
elif warunek3
polecenie3
else
polecenie4
fi


Uwaga: jeśli dodamy znaku wykrzyknika przed warunkiem, to polecenie wykona się tylko wtedy, gdy warunek NIE jest spełniony, np instrukcja

if [ ! -e plik ]
then
polecenie
fi

spowoduje że polecenie wykona się tylko wtedy, gdy plik NIE istnieje.

Skrypt sprawdza czy plik o nazwie moj_plik jest zwykłym plikiem,
katalogiem, czy dowiązaniem symbolicznym

#!/bin/bash

if [ ! -e moj_plik ] ;then
echo "Plik nie istnieje"
elif [ -f moj_plik ] ;then
echo "Zwykły plik"
elif [ -d moj_plik ];then
echo "Katalog"
elif [ -L moj_plik ];then
echo "Dowiazanie symboliczne"
else
echo "Nie moge dopasowac rodzaju pliku"
fi

Skrypt pyta o hasło i sprawdza czy jest poprawne

#!/bin/bash

echo "Podaj haslo"

read haslo

if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
else
echo "Dostep zabroniony"
fi

Skrypt pyta o hasło i sprawdza czy jest poprawne
wersja z niewidocznym hasłem

#!/bin/bash
printf "Podaj haslo: "
stty -echo
read haslo
stty echo

if [ "$haslo" = "tajne" ]
then
echo "Prawidlowe haslo"
else
echo "Dostep zabroniony"
fi


Lista ważniejszych warunków:

-e plik - prawda, jeśli plik istnieje
-d plik - prawda, jeśli plik istnieje i jest katalogiem
-f plik - prawda, jeśli plik istnieje i jest zwykłym plikiem
-L plik - prawda, jeśli plik istnieje i jest dowiązaniem symbolicznym
-r plik - prawda, jeśli plik istnieje i można go czytać
-w plik - prawda, jeśli plik istnieje i można do niego pisać
-x plik - prawda, jeśli plik istnieje i można go wykonywać
-s plik - prawda, jeśli plik istnieje i ma rozmiar większy od zera
-g plik - prawda, jeśli plik istnieje i ma ustawiony bit set-group-id
-u plik - prawda, jeśli plik istnieje i ma ustawiony bit set-user-id
-b plik - prawda, jeśli plik istnieje i jest urządzeniem blokowym
-c plik - prawda, jeśli plik istnieje i jest urządzeniem znakowym


plik1 -nt plik2 - prawda, jeśli plik1 jest nowszy (zgodnie z datą modyfikacji) niż plik2
plik1 -ot plik2 - prawda, jeśli plik1 jest starszy niż plik2
plik1 -ef plik2 - prawda, jeśli plik1 i plik2 mają te same numery urządzenia i i-węzła


-z ciąg - prawda, jeśli ciąg długość równą zero
-n ciąg - prawda, jeśli ciąg długość większą od zera
ciąg1 = ciąg2 - prawda, jeżeli ciągi są jednakowe
ciąg1 != ciąg2 - prawda, jeżeli ciągi są różne
! wyrażenie - prawda, jeżeli wyrażenie jest fałszywe


wyrażenie -a wyrażenie -prawda, jeśli oba wyrażenia są prawdziwe
wyrażenie -o wyrażenie - prawda, jeżeli przynajmniej jedno z wyrażeń jest prawdziwe


argument1 -eq argument2 - prawda, jeśli argument1 jest równy argumentowi2
argument1 -ne argument2 - prawda, jeśli argument1 jest różny od argumentu2
argument1 -gt argument2 - prawda, jeśli argument1 jest większy od argumentu2
argument1 -ge argument2 - prawda, jeśli argument1 jest większy lub równy argumentu2
argument1 -lt argument2 - prawda, jeśli argument1 jest mniejszy od argumentu2
argument1 -le argument2 - prawda, jeśli argument1 jest mniejszy lub równy argumentowi2

Ostatnio dodano

O stronie

Stronę najlepiej oglądać w rozdzielczości 1024x768. Strona optymalizowana dla przeglądarki Mozilla.

Prośba

Jeśli chciałbyś coś zmienić lub uważasz że czegoś brakuje pisz. Odpiszę na każdy list.

Subskrypcja

Jeśli chcesz być informowany o nowościach na stronie wpisz tu swój e-mail i kliknij Wyślij.

O mnie

O autorze
Autorem kursu jest Mariusz Majerowski
Ostatnia aktualizacja: 23 VI 2004.