2012-01-11 36 views
6

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.

+0

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

+0

@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

Trả lời

7

Nếu bạn chỉ muốn các hộp kiểm bên trong một kịch bản, bạn có thể sử dụng whiptail(1) hoặc dialog(1) công cụ để tạo các hộp kiểm:

$ whiptail --checklist "Please pick one" 10 60 5 one one off two two off\ 
    three three off four four off five five off 


       ┌──────────────────────────────────────────────────────────┐ 
       │ [ ] one one          │ 
       │ [*] two two          │ 
       │ [ ] three three          │ 
       │ [*] four four          │ 
       │ [ ] five five          │ 
       │               │ 
       │    <Ok>     <Cancel>    │ 
       │               │ 
       └──────────────────────────────────────────────────────────┘ 

"two" "four"$ 

Các thức "two" "four" là các mục được lựa chọn trở về từ chương trình whiptail(1).

Nếu bạn đang tự mình lập trình cho vui, hãy cho tôi biết và tôi sẽ chuyển đổi thành nhận xét này với hy vọng một người khác sẽ tìm thấy gợi ý hữu ích trong tương lai.

+0

Tôi đọc về hộp thoại, nhưng tôi muốn làm điều gì đó vì tôi không muốn cài đặt thêm bất kỳ thứ gì không được cài đặt theo mặc định (được sử dụng trong Lubuntu 10.10 trong thiết bị đầu cuối mỏng) nhưng tôi không biết về whiptail và nó được cài đặt trong distro Tôi yêu cầu để chạy script = D Tôi chắc chắn sẽ thử nó! Cảm ơn. Tuy nhiên, để học hỏi những người trong nhà, tôi đã dành một vài giờ trong kịch bản nhỏ của mình, thật thú vị khi biết cách vượt qua 1 ký tự đó và đọc 3 ký tự cùng một lúc;) Cảm ơn bạn đã trả lời, khá hữu ích;) – Metafaniel

4

Ngoài ra, bạn có thể sử dụng thư viện của tôi tại https://sites.google.com/site/easybashgui

Nó phát hiện tự động nếu thoại hoặc whiptail được cài đặt. (Thông thường, ít nhất một trong hai luôn luôn hiện diện ngay cả trong hệ thống trần ...)

Vì vậy, kịch bản của bạn trở thành:

source easybashgui; menu 1 2 3 ; clean_temp

Tại sao reinventing the wheel? ; P