Vstup pomocí read
Příkaz read je určen ke čtení standardního vstupu (nebo jiného file
descriptoru, viz příští kapitola). Je-li použit bez
dalších argumentů, přečte řádek a uloží jej do proměnné REPLY a skončí úspěšně
(vrátí 0). Pokud se řádek přečíst nepodaří, skončí neúspěšně (vrátí nenulovou
hodnotu). Příkaz akceptuje několik zajímavých argumentů, které lze najít
v dokumentaci,1 některé z nich si ukážeme v následujícím příkladu
# zakladni pouziti
# neuspech lze otestovat pomoci Ctrl-d
if read
then
echo "vlozeno: '${REPLY}'"
else
echo "neuspesny read"
fi
# -p vytiskne prompt
if read -p "Vlozte vstup: "
then
echo "Vlozeno: '${REPLY}'"
else
echo "Neuspesny read"
fi
# parametry jsou promenne, do ktery se ulozi jednotliva vlozena slova, v
# ychozi oddelovac je mezera, lze jej nastavit prepinacem -d
# promenna REPLY je prazdna
if read -p "Vlozte vstup: " var1 var2
then
echo "REPLY: ${REPLY}"
echo "var1: ${var1}"
echo "var2: ${var2}"
else
echo "neuspesny read"
fi
# prepinac -s zabrani tisteni vstupu pri zadavani (jako u hesel)
if read -s -p "Vlozte vstup: " var1 var2
then
echo ""
echo "var1: ${var1}"
echo "var2: ${var2}"
else
echo "neuspesny read"
fi
# prepinac '-n nchar' ukonci cteni po nchar znacich (nebo klasickym zpusobem)
if read -n 1 -p "Chcete pokracovat [Y/N]? " var1
then
case ${var1} in
Y | y) echo
echo "pokracujeme" ;;
N | n) echo
echo "nepokracujeme" ;;
*) echo
echo "${var1} je nespravne zadani" ;;
esac
else
echo "neuspesny read"
fi
# pomoci '-t secs' muzeme dat uzivateli casovy limit na odpoved
if read -t 5 -p "Vstup: " var1
then
echo ${var1}
else
echo
echo "neuspesny read nebo to uzivatel nestihl"
fi
V případě, že po uživateli skriptu potřebujeme nějaké rozhodnutí, je příjemnou
alternativou příkazu read příkaz select. Bližší informace lze nalézt
v [practical] (kapitola 10), případně v manuálu
Bash Manuál.
Příkazem read můžeme číst i ze souboru (po řádcích v cyklu) tak, že soubor
přesměrujeme na standardní vstup cyklu. Čtení není úspěšné, přečte-li read
konec souboru.
# presmerovani pomoci <
count=1
while read line
do
echo "radek ${count}: ${line}"
count=$[${count} + 1]
done < soubor.txt
# alternativne lze rourou do while presmerovat vystup cat
# pozor: telo cyklu pak bezi v podshellu, promenne po cyklu zaniknou
count=1
cat soubor.txt | while read line
do
echo "radek ${count}: ${line}"
count=$[${count} + 1]
done
-
help read↩