2012-01-11 13 views
6

Sto provando a fare uno script bash molto semplice che emula il comportamento delle checkbox in apparenza! Voglio mostrare alcune opzioni e spostare il cursore sulla casella successiva in base alla pressione dei tasti freccia sinistra o destra. Sono già riuscito a farlo utilizzando le sequenze di escape READ e Ansii per rilevare i tasti freccia e utilizzare tput per spostare il cursore.Caselle di controllo con script bash

Il mio problema con questo è che ho bisogno di leggere una certa lettera (x per esempio) per essere premuto e quindi prendere un'altra azione. Ma come posso rilevare questo tasto premere e allo stesso tempo rilevare se un tasto freccia viene premuto o no ??

Per rilevare i codici ansii ho bisogno di leggere 3 caratteri e con il carattere X (il tasto per "selezionare") Ho bisogno di leggere solo uno, come posso leggere 3 caratteri e allo stesso tempo leggerne uno solo?

Inoltre, ho cercato di creare qualcosa in modo che l'utente possa semplicemente premere i tasti freccia sinistra o destra o il tasto x, ma se preme QUALSIASI altro tasto, non dovrebbe accadere nulla!

Ho fatto questo fino a questo punto:

#!/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 

sì lo so, non è il codice più perfetto mai, ma sto cercando di imparare. I suggerimenti saranno molto apprezzati.

+0

Avete già esaminato la dichiarazione di 'selezione' di bash? Non è esattamente la casella di controllo, ma è un menu numerato. – SiegeX

+0

@SiegeX Sì, conosco questo comando e l'ho provato, tuttavia non ho trovato il modo di forzarlo ad accettare solo determinati tasti sulla tastiera. Voglio che la mia piccola sceneggiatura sia user-safe-proof = P Intendo un modo in cui l'utente non riesce a digitare nulla! Con select anche se è utile, se le opzioni sono 1, 2, 3 un utente può digitare idfsbhisdolasokjcmnh e voglio che siano costretti a digitare solo ciò che è necessario e il resto della tastiera a essere "bloccato". Grazie per la tua risposta;) – Metafaniel

risposta

7

Se si desidera solo le caselle di controllo in uno script, è possibile utilizzare i whiptail(1) o dialog(1) strumenti per creare le caselle di controllo:

$ 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"$ 

La finale "two" "four" è le voci selezionate restituiti dal programma whiptail(1).

Se stai programmando questo per divertirti da solo, fammelo sapere e convertirò questo in un commento nella speranza che qualcun altro troverà il suggerimento utile in futuro.

+0

Ho letto di dialogo, ma volevo fare qualcosa perché non volevo installare altro che non fosse installato di default (per essere usato in Lubuntu 10.10 in terminali sottili) ma non sapevo di whiptail ed è installato nella distro ho bisogno di eseguire la sceneggiatura = D Proverò sicuramente! Grazie. Tuttavia, per imparare i purpouses, ho trascorso alcune ore nella mia piccola sceneggiatura, sarebbe stato interessante sapere come superare quella lettura di 1 personaggio e leggere 3 caratteri contemporaneamente;) Grazie per la tua risposta, molto utile;) – Metafaniel

4

In alternativa, è possibile utilizzare la mia biblioteca di https://sites.google.com/site/easybashgui

Si rileva automaticamente se dialogo o whiptail è installato. (Normalmente, almeno uno dei due è sempre presente anche nei sistemi nude ...)

Così i vostri script diventa:

source easybashgui; menu 1 2 3 ; clean_temp

Perché reinventare la ruota? ; P

Problemi correlati