Verificando backspace

1

Se eu fizer

read -n 1 c

e insira um backspace.

Como eu testo que $c contém um backspace?

[ "$c" = $'\b' ] 

não funciona.

O que estou tentando fazer é ter um programa em que eu possa ler uma linha e disponibilizá-la instantaneamente antes mesmo de a linha terminar:

#!/usr/bin/env bash
ttySettings='stty --save'
stty -echo
str=
while read -n1 c; do
  if [ -z "$c" ]; then
    break
  fi
  if [ "$c" = $'\b' ]; then
    str="${str%?}"
  else
    str="${str}$c"
  fi
  printf '\r'
  for((i=0;i<COLUMNS;i++)); do
    printf ' '
  done
  printf '\r%s' "$str"
done
echo "$str"
stty "$ttySettings"

Eu basicamente quero filtrar uma lista com base na linha inserida (a ser mostrada abaixo da linha inserida) e quero que a filtragem seja ao vivo.

    
por PSkocik 21.11.2015 / 20:20

2 respostas

1

Sua verificação de retrocesso parece funcionar. No entanto, o script para limpar a linha não está funcionando (para mim, com o bash 4.2.37). O loop seguinte

printf '\r'

pode ser substituído por tput :

tput el1

( antes imprimindo o \r ).

    
por 21.11.2015 / 20:46
1

Use apenas $'7' em vez de \b :

if [ "$c" = $'7' ]; then
    echo 'Whoa, we got a backspace!'
fi
    
por 21.11.2015 / 20:47

Tags