Pobieranie danych
Pedros
Wprowadzanie danych
Czasami potrzeba nam wprowadzić jakieś dane początkowe aby skrypt dalej sam sobie liczyl lub obrabiał dane, np. tworzymy prostą książkę adresową i potrzebujemy pobrać imię i nazwisko od osoby która uruchomiła skrypt. Ogólnie do pobierania danych służy polecenie read. Ma bardzo prostą składnię i myślę, że poniższy przykład wyjasni całe jego działanie:#!/bin/sh
echo ?Wpisz swoje imie:?
read imie
echo ?Wpisz swoje nazwisko:?
read nazwisko
echo ?Twoje imie to: $imie a nazwisko to $nazwisko?
Prawda, że proste działanie? Nasz skrypt jest prosty ale można go jeszcze uprościć. Zamiast wywoływać dwa razy polecenie read można dokładnie to samo zrobić krócej:
#!/bin/sh
echo ?Podaj imie i nazwisko?
read imie nazwisko
echo ?Twoje imie to: $imie a nazwisko to $nazwisko?
Read z parametrów mu podanych zrobi zmienne właśnie tak się nazywające które można normalnie używać ze znakiem dolara jak zwykłe zmienne. Polecenie read ma bardzo przydatne przełączniki które sprawiają, że skrypt zachowuje się trochę inaczej.
- -t ? timeout. Read będzie czekać na wprowadznie danych określoną ilość sekund. np.
#!/bin/sh
echo ?Wprowadz imie i nazwisko masz 5sek?
read -t 5 imie nazwisko
if [[ `echo $imie` == ?? ]]
then
echo ?Czas minal...?
else
echo ?Wprowadzone imie i nazwisko: $imie $nazwisko?
fi
- -n ? maksymalna ilość wprowadzonych znaków. Przydatne gdy chcemy pobrać okresloną ilość znaków, np. gdy chcemy pobrac numer telefonu komorkowego, np. 501123456 jak w przykładzie:
#!/bin/sh
echo ?Wprowadz 9 cyfr numeru telefonu?
read -n 9 telefon
echo ?Twoj numer telefonu to: $telefon?
Gdy wprowadzimy 9 znaków automatycznie skrypt będzie dalej wykonywany, nie będzie trzeba naciskć klawisza enter. Od razu w zmiennej $telefon będzie 9 znaków.
- -p ? znak zachęty będzie wyświetlany w jednej linii razem z opisem, np.
#!/bin/sh
read -p ?Podaj imie i nazwisko? imie nazwisko
echo ?Podales: $imie $nazwisko?
- -d ? znak którym zakończymy wprwadzanie danych, np.
#!/bin/sh
echo ?Wprowadz cyfry i wprowadzanie zakoncz 0?
read -d 0 cyfry
echo ?Wprowadzone cyfry to: $cyfry?
Powyższy skrypt będzie przyjmował dowolną ilość cyfr do momentu aż ktoś naciśnie cyfre 0 wtedy wprowadzanie danych automatycznie zostanie zakończone i to co wprowadziliśmy będzie w podanej zmiennej.
- -a ? wprowadzone dane będą poustawiane w komórki tablicy, np.
#!/bin/sh
echo ?Wprowadz liczby oddzielajac je spacjami?
read -a tablica
echo ?Cala tablica: ${tablica[*]}?
echo ?Element o indeksie 2: ${tablica[2]}?
Bardzo przydatny przełącznik i ułatwiający wprowadzanie danych. Można by było oczywiście zrobić to za pomocą pętli i odczytywać tylko jedną wartość i umieszczać w tablicy jednak tak jest o wiele prościej.
Można łączyć ze sobą powyższe przełączniki. Gdy chcemy aby użytkownik w ciągu 10 sekund podał 9 znaków numeru telefonu to można zrobić np tak:
#!/bin/sh
echo ?Wprowadz w ciagu 10sek 9 cyfr numeru telefonu?
read -t 10 -n 9 telefon
echo ?Wprowadzony numer to: $telefon?
W naszym wypadku jesli minie 10sekund a wprowadzimy tylko 3 znaki to w zmiennej $telefon nie będzie nic. Jeśli w ciagu 10sekund zdąrzymy wpisać 9 znaków z klawiatury to będą one w zmiennej $telefon.
Trochę amatorski ten if-> if `echo $imie` == ?? , nie lepiej if [ -z $imie ] ?