带有 bash 脚本的复选框

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8813260/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-18 01:16:37  来源:igfitidea点击:

Checkboxes with bash script

bashcheckboxarrow-keys

提问by Metafaniel

I am trying to do a very simple bash script which emulates the behavior of checkboxes in appearance! I want it to show some options and move the cursor to the next checkbox according to the key press of the left or right arrow keys. I've already managed to do this using READ and Ansii escape sequences to detect the arrow keys and I use tput to move the cursor.

我正在尝试做一个非常简单的 bash 脚本,它在外观上模拟复选框的行为!我希望它显示一些选项并根据向左或向右箭头键的按键将光标移动到下一个复选框。我已经设法使用 READ 和 Ansii 转义序列来检测箭头键并使用 tput 移动光标。

My problem with this it's that I need to read a certain letter (x for instance) to be pressed and then take another action. But how can I detect this key press and at the same time detect if an arrow key it's being pressed or not??

我的问题是我需要阅读某个字母(例如 x)才能按下,然后再执行另一个操作。但是我怎样才能检测到这个按键按下的同时检测它是否被按下了一个箭头键?

To detect the ansii codes I need to read 3 characters and with the X character (the key to "select") I need to read just one, how can I read 3 characters and at the same time read just one?

要检测 ansii 代码,我需要读取 3 个字符,而使用 X 字符(“选择”的键)我只需要读取一个,如何在读取 3 个字符的同时只读取一个?

Also I've been trying to make something so the user can JUST press the left or right arrow keys or the x key but if he presses ANY other key, nothing should happen!

此外,我一直在尝试做一些事情,以便用户只需按向左或向右箭头键或 x 键,但如果他按任何其他键,则不会发生任何事情!

I've done this this far:

我已经做到了这一点:

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

Yes I know, it's not the most perfect code ever but I'm trying to learn. Suggestions will be very appreciated.

是的,我知道,这不是有史以来最完美的代码,但我正在努力学习。建议将不胜感激。

回答by sarnold

If you just want the checkboxes in a script, you can use the whiptail(1)or dialog(1)tools to create the checkboxes:

如果您只想要脚本中的复选框,您可以使用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"$ 

The final "two" "four"is the selected entries returned from the whiptail(1)program.

最后"two" "four"是从whiptail(1)程序返回的选定条目。

If you're programming this for the fun of it yourself, let me know and I'll just convert this to a comment in the hopes that someone else will find the hint useful in the future.

如果您自己编程是为了好玩,请告诉我,我会将其转换为评论,希望其他人将来会发现该提示有用。

回答by vaisarger

Alternatively, you can use my library at https://sites.google.com/site/easybashgui

或者,您可以在https://sites.google.com/site/easybashgui使用我的图书馆

It detects automatically if dialogor whiptailis installed. (Normally, at least one of two is always present even in bare systems...)

它会自动检测是否安装了dialogwhiptail。(通常,即使在裸系统中,至少也总是存在两个中的一个......)

So your scripts becomes:

所以你的脚本变成:

source easybashgui; menu 1 2 3 ; clean_temp

source easybashgui; menu 1 2 3 ; clean_temp

Why reinventing the wheel?;P

为什么要重新发明轮子?;P