2012-01-11 16 views
6

私は外見上のチェックボックスの動作をエミュレートする非常に単純なbashスクリプトを実行しようとしています! 私はいくつかのオプションを表示し、左または右の矢印キーのキーを押すことに応じて、次のチェックボックスにカーソルを移動します。私はすでに、矢印キーを検出するためにREADとAnsiiのエスケープシーケンスを使用してこれを行いました。そして、カーソルを移動するためにtputを使用します。bashスクリプトを使ったチェックボックス

私の問題は、特定の文字(たとえばx)を押してから別の操作を行う必要があることです。しかし、どのように私はこのキープレスを検出することができますと同時に矢印キーが押されているかどうかを検出しますか?

ansiiコードを検出するには、3文字を読み取る必要があり、X文字(「選択」するためのキー)を使用する必要があります。1文字だけを読む必要があります。

また、ユーザーは左矢印キーまたは右矢印キーまたはxキーを押すことができるようにしようとしていますが、他のキーを押した場合は何も起こりません。

私はこれまでのところ、これをやった:

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

は、はい、私は知っている、それはこれまでで最も完璧なコードではないのですが、私は学ぶことをしようとしています。提案は非常に高く評価されます。

+0

まだbashの 'select'ステートメントを見ましたか?正確なチェックボックスではありませんが、番号付きのメニューです。 – SiegeX

+0

@SiegeXはい私はこのコマンドについて知っていて、試しましたが、キーボード上の特定のキーだけを受け入れる方法はありませんでした。私は私の小さなスクリプトがユーザー安全であることを証明したい= P私はユーザーがちょうど何も入力することができない方法を意味する! selectを使用しても、オプションが1,2,3の場合、ユーザーはidfsbhisdolaso​​kjcmnhと入力することができ、必要なものを入力し、キーボードの残りの部分を「ロック」するように強制することができます。あなたの返信をありがとう;) – Metafaniel

答えて

7

あなただけのスクリプト内のチェックボックスをしたい場合は、チェックボックスを作成するためにwhiptail(1)またはdialog(1)ツールを使用することができます。

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

最終"two" "four"whiptail(1)プログラムから返された選択されたエントリです。

あなた自身の楽しみのためにこれをプログラミングしているなら、私に知らせてください。私は、これを他の誰かが将来有用なヒントを見つけることを期待してコメントに変換します。

+0

私はダイアログについて読んでいましたが、デフォルトでインストールされていないものを何もインストールしたくないので何かしたいと思っていました(Lubuntu 10で使用するためです。スリム端末では10)、私はwhiptailについて知りませんでした。それはディストリビューションにインストールされていますので、スクリプトを実行する必要があります= D私は必ずそれを試してみましょう!ありがとう。しかし、パープルを学ぶために、私は小さなスクリプトで数時間を費やしましたが、それを克服して同時に3文字を読む方法を知ることは面白いでしょう; – Metafaniel

4

また、あなたはダイアログまたはです:whiptailがインストールされている場合は自動的に検出 https://sites.google.com/site/easybashgui

で私のライブラリを使用することができます。 (2の通常、少なくとも一方が...でも、裸のシステムでは常に存在している)

だからあなたのスクリプトは次のようになります。

source easybashgui; menu 1 2 3 ; clean_temp

車輪の再発明はなぜ? ; P

関連する問題