Como ler '\ n' na variável com o comando interno do Bash?

2

De alguma forma, não consigo read o sinal \n à direita na variável REPLY . Em qualquer circunstância eu quero evitar uma linha em branco que resulta do \n sendo ecoado por read mas echo um no caso de outro caractere. Dado:

declare -l REPLY
read >&2 -r -N 1 -p "Acknowledged? (y):" REPLY
if [[ "$REPLY" != $'\n' ]]; then
  echo >&2
fi

Para mim, uma solução possível é fazer com que read suprima ( -s ) o eco da entrada. Mas, idealmente, o usuário deve ver o caractere único que ele insere após o prompt.

Além disso, IFS= read -d'' não me mostra o caractere \n na variável.

Alguma idéia?

    
por Tim Friske 18.11.2012 / 15:17

3 respostas

2

FWIW, seu código funciona para mim.

$ echo | bash -c 'read -rN1; echo "$BASH_VERSION <$REPLY>"'
4.2.36(1)-release <
>

Com -N , não é necessário definir IFS e NL acaba em $ REPLY. Um $REPLY vazio significaria apenas NUL ( <Ctrl-Space> ) ou EOF ou um erro (o status de saída seria diferente de zero para esses dois)

    
por 18.11.2012 / 17:38
0

A leitura usa \n como seu separador de registro, portanto, nunca estará em $REPLY . A nova linha que você está vendo é resultado de echo . Se você quiser verificar apenas uma nova linha em uma linha (ou seja, uma linha em branco), um desses testes funcionará:

[[ $REPLY == "" ]] # true if line is empty
(( ${#REPLY} )) # true if line is not empty

Observe que, como você não invoca read com IFS= , isso também corresponderá à entrada que consiste apenas em espaços em branco.

    
por 18.11.2012 / 15:20
0

Como Chris mencionou, é um separador, no entanto, para verificar o tamanho da string, você faria o seguinte:

if [ -z "$REPLY" -o "$REPLY" == "y" ]; then
    echo "It was acknowledged"
else
    echo "Not acknowledged"
    exit 1
fi
    
por 18.11.2012 / 15:37