Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

  1. help read ↩