Mengapa ini selalu terdeteksi sebagai benar, bahkan jika kode kunci itu bukan tombol panah kanan?
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
sumber
sumber
Jawaban:
Anda (kemungkinan) membaca pertama dari dua + byte.
$keycode
dalam skrip Anda akan menjadi ESC ketika tombol panah ditekan.Tombol panah dapat:
Itu selalu bernilai true karena ruang yang hilang dalam ekspresi bersyarat.
Edit: pembaruan pada pernyataan itu.
Anda
if
beroperasi pada status keluar dari[
perintah. The[
perintah setara dengantest
. Fakta bahwa itu adalah perintah adalah fakta yang sangat penting. Sebagai perintah itu membutuhkan spasi di antara argumen. The[
perintah khusus lebih lanjut dalam hal itu membutuhkan]
sebagai argumen terakhir.Perintah keluar dengan status yang ditentukan oleh EXPRESSION. 1 atau 0, benar atau salah .
Ini bukan cara eksotis untuk menulis kurung. Dengan kata lain itu bukan bagian dari
if
sintaksis seperti misalnya dalam C:Oleh:
Anda mengeluarkan:
yang diperluas ke
di sini
\x1b=39
dibaca sebagai satu argumen. Ketikatest
atau[
diberikan satu argumen ia keluar dengan false hanya jika EXPRESSION adalah null - yang tidak akan pernah terjadi. Bahkan jika$keycode
kosong, itu akan menghasilkan=39
(yang bukan nol / kosong).Cara lain untuk melihatnya adalah dengan mengatakan:
Baca pertanyaan dan jawaban ini untuk lebih jelasnya - serta diskusi tentang
[
vs[[
:Dalam hal ini, Anda juga dapat meneliti kembali ticks `` vs
$( )
Urutan melarikan diri multibyte dengan tombol panah:
Seperti disebutkan di atas: Anda (kemungkinan) membaca pertama dari dua + byte.
$keycode
dalam skrip Anda akan menjadi ESC ketika tombol panah ditekan.Panah dan kunci khusus lainnya menghasilkan urutan melarikan diri untuk dikirim ke sistem. The ESC byte sinyal bahwa "inilah beberapa byte yang harus ditafsirkan secara berbeda" . Adapun tombol panah yang akan menjadi ASCII yang
[
diikuti oleh ASCIIA
,B
,C
atauD
.Dengan kata lain Anda harus mengurai tiga byte saat berurusan dengan tombol panah.
Anda dapat mencoba sesuatu ke arah ini untuk memeriksa:
Menghasilkan:
Tidak yakin seberapa portabel ini, tetapi sebelumnya bermain-main dengan kode seperti ini untuk menangkap tombol panah. Tekan
q
untuk berhenti:(Sebagai catatan kecil Anda juga (bermaksud untuk) menguji terhadap desimal 39 - yang terlihat seperti campuran antara desimal dan heksadesimal. Byte pertama dalam urutan melarikan diri adalah nilai ASCII ESC , yang desimal 27 dan heksadesimal
0x1b
, sedangkan desimal 39 adalah heksadesimal0x27
. )sumber
=
tanda dalam tes, jadi itu diurai hanya sebagai string yang tidak kosong dan karenanya benar. Fakta bahwa tombol panah adalah beberapa byte adalah masalah yang terpisah.[
adalah perintah bawaan, orang-orang memahami mengapa ruang menjadi penting lebih cepat. (Ini bukan sekadar cara aneh bash untuk menggunakan tanda kurung alih-alih tanda kurung.) Harus kehabisan sekarang. Perbarui sekali kembali.