Tôi đang cố gắng thực hiện một tập lệnh bash rất đơn giản mô phỏng hành vi của các hộp kiểm xuất hiện! Tôi muốn nó hiển thị một số tùy chọn và di chuyển con trỏ đến hộp kiểm tiếp theo theo nhấn phím của các phím mũi tên trái hoặc phải. Tôi đã quản lý để làm điều này bằng cách sử dụng READ và Ansii thoát chuỗi để phát hiện các phím mũi tên và tôi sử dụng tput để di chuyển con trỏ.Hộp kiểm có bash script
Vấn đề của tôi với điều này là tôi cần đọc một chữ cái nào đó (ví dụ x) để được nhấn và sau đó thực hiện một hành động khác. Nhưng làm cách nào tôi có thể phát hiện phím bấm này và đồng thời phát hiện nếu một phím mũi tên đang được nhấn hay không?
Để phát hiện mã ansii, tôi cần phải đọc 3 ký tự và ký tự X (phím để "chọn") Tôi chỉ cần đọc một ký tự, làm cách nào để đọc 3 ký tự và đồng thời chỉ đọc một ký tự?
Ngoài ra tôi đã cố gắng để làm một cái gì đó để người dùng có thể CHỈ bấm các phím mũi tên trái hoặc phải hoặc phím x nhưng nếu anh ta nhấn bất kỳ phím khác, không có gì nên xảy ra!
Tôi đã làm điều này này cho đến nay:
#!/bin/bash
## Here I just print in the screen the "form" with the "checkboxes"
function screen_info(){
clear
cat <<EOF
/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_
||
|| 1[ ] 2[ ] 3[ ]
||
#############################
EOF
}
## This function detects the arrow keys and moves the cursor
function arrows(){
## I use ANSII escape sequences to detect the arrow keys
left_arrow=$'\x1b\x5b\x44' #leftuierda
right_arrow=$'\x1b\x5b\x43' #rightecha
just_x_key=""
## With tput I move the cursor accordingly
cursor_x=14
cursor_y=3
tput cup $cursor_y $cursor_x
while [ -z "$just_x_key" -o "$just_x_key" != "$just_x_key" ]; do
read -s -n3 key
while [ `expr length "$key"` -ne 3 ]; do
key=""
read -s -n3 key
break
done
case "$key" in
$left_arrow)
if [ $cursor_x -gt 14 ]; then
cursor_x=`expr $cursor_x - 8`
fi
tput cup $cursor_y $cursor_x
#This is supposed to be a simple condition detecting the x key pressed wich I want to trigger something... But how to read a single character to this condition and 3 characters at the same time if the user presses the arrow key ???? =/
#read -s just_x_key
#if [ $just_x_key == x ]; then
# echo X
# tput cup 7 15
# echo "YOU PRESSED THE RIGHT KEY!!! =D"
#fi
;;
$right_arrow)
if [ $cursor_x -lt 28 ]; then
cursor_x=`expr $cursor_x + 8`
fi
tput cup $cursor_y $cursor_x
#read -s just_x_key
#if [ $just_x_key == x ]; then
# echo X
# tput cup 7 15
# echo "YOU PRESSED THE RIGHT KEY!!! =D"
#fi
;;
esac
done
exit $?
}
#EXECUTION
#=========
## I just call the functions!
screen_info
arrows
Vâng, tôi biết, nó không phải là mã hoàn hảo nhất từng được nhưng tôi đang cố gắng để tìm hiểu. Gợi ý sẽ rất được đánh giá cao.
Bạn đã xem câu lệnh bool 'select' chưa? Nó không phải là hộp kiểm chính xác, nhưng nó là một trình đơn được đánh số. – SiegeX
@SiegeX Có Tôi biết về lệnh này và thử nó, tuy nhiên tôi đã không tìm thấy một cách để buộc nó chỉ chấp nhận một số phím trên bàn phím. Tôi muốn kịch bản nhỏ của tôi được người dùng an toàn bằng chứng = P Tôi có nghĩa là một cách người dùng chỉ có thể không gõ bất cứ điều gì! Với lựa chọn ngay cả khi nó hữu ích, nếu các tùy chọn là 1, 2, 3 một người dùng có thể gõ idfsbhisdolasokjcmnh và tôi muốn họ bị buộc phải chỉ cần gõ những gì cần thiết và phần còn lại của bàn phím được "khóa". Cảm ơn bạn đã trả lời của bạn;) – Metafaniel