Zsh, 94 bytes
while (($#a<4)); do read -sk1 k case $k {$'\C-?')a[1]=;;[0-9])a+=*;} printf '\r\e[K%s' $a done # $#foo: length of $foo while (($#asterisks < 4)); do # -s: silent/noecho, -k 1: one keypress read -s -k 1 key case $key { # backspace: delete first character from asterisks string $'\C-?') asterisks[1]= ;; [0-9]) asterisks+=* } # \r: start of line, \e[K: clear to end of line printf '\r\e[K%s' $asterisks done