Por que isso sempre é detectado como verdadeiro, mesmo que o código da chave não seja a tecla de seta para a direita?
stty_state=`stty -g`
stty raw; stty -echo
keycode=`dd bs=1 count=1 2>/dev/null`
stty "$stty_state"
echo $keycode
if [ "$keycode"=39 ]; then
echo "Right Arrow Key Pressed!"
fi
bash
shell-script
ConfusedStack
fonte
fonte
Respostas:
Você (provavelmente) leu primeiro de dois + bytes.
$keycode
no seu script seria ESC quando a tecla seta for pressionada.As teclas de seta podem ser:
Ele sempre é avaliado como verdadeiro devido à falta de espaços na expressão condicional.
Edit: uma atualização sobre essa declaração.
Seu
if
opera no status de saída do[
comando. O[
comando é equivalente atest
. O fato de ser um comando é um fato muito importante. Como um comando, ele requer espaços entre argumentos. O[
comando é ainda mais especial, pois requer]
como último argumento.O comando sai com o status determinado por EXPRESSION. 1 ou 0, verdadeiro ou falso .
É não uma forma exótica de escrever parêntesis. Em outras palavras, não faz parte da
if
sintaxe, como por exemplo em C:De:
você emite:
que se expande para
aqui
\x1b=39
é lido como um argumento. Quandotest
ou[
é dado um argumento, ele sai com false apenas se EXPRESSION for nulo - o que nunca será. Mesmo se$keycode
estivesse vazio, resultaria em=39
(que não é nulo / vazio).Outra maneira de ver é que você diz:
Leia estas perguntas e respostas para obter mais detalhes - assim como a discussão sobre
[
vs[[
:Nesse sentido, você também pode pesquisar os ticks anteriores `` vs
$( )
Sequência de escape multibyte com teclas de seta:
Como mencionado na parte superior: Você (provavelmente) leu primeiro de dois + bytes.
$keycode
no seu script seria ESC quando a tecla seta for pressionada.As setas e outras teclas especiais resultam em sequências de escape a serem enviadas ao sistema. O byte ESC sinaliza que "aqui estão alguns bytes que devem ser interpretados de maneira diferente" . Quanto teclas de seta que seria o ASCII
[
seguido por ASCIIA
,B
,C
ouD
.Em outras palavras, você deve analisar três bytes ao lidar com as teclas de seta.
Você pode tentar algo na direção disso para verificar:
Produção:
Não tenho certeza de como isso é portátil, mas já brincamos com códigos como este para pegar as teclas de seta. Pressione
q
para sair:(Como nota secundária, você também (pretende) testar contra o decimal 39 - que se parece com uma mistura entre decimal e hexadecimal. O primeiro byte de uma sequência de escape é o valor ASCII ESC , que é decimal 27 e hexadecimal
0x1b
, enquanto o decimal 39 é hexadecimal0x27
. )fonte
=
sinal no teste, portanto ele é analisado simplesmente como uma sequência não vazia e, portanto, é verdade. O fato de as teclas de seta terem vários bytes é um problema separado.[
é um comando interno, as pessoas entendem por que os espaços são importantes muito mais rapidamente. (Não é simplesmente uma maneira estranha de bash usar colchetes em vez de parênteses.) Tem que acabar agora. Atualize uma vez de volta.