尝试制作动态对话框bash菜单(表单、输入、信息、fselect)

问题描述 投票:0回答:1

我想制作一个脚本来添加一些书籍或文件夹到calibredb,我想使用带有对话框的bash gui。 我是个新手,正在自学,所以代码可能很奇怪..

我的主菜单看起来像这样:

function main_menu(){

    MENU=$(dialog --clear --title "Calibre" \
        --backtitle "Add Books" \
        --menu "What to do ?" \
        0 0 0 "C" "Choose a book or a folder" "M" "Enter metadata infos" "L" "Add selected Book(s)" "D" "Change default Directory for books" "E" "Exit" \
        2>&1 >/dev/tty)
        
    if [ $MENU = "C" ];then
        select=$(file_selector $mnt)
    elif [ $MENU = "M" ];then
        form_data
    elif [ $MENU = "L" ];then
        if [ -d $select ];then
            add_folder $select
        elif [ -f $select ];then
            if [[ $file == *.cbz || $file == *.pdf ]]; then
                add_book $select
            else
                error "Books should has extension .cbz .pdf"
            fi
        else
            error "No file or folder selected"
        fi
    elif [ $MENU = "D" ];then
        NEWDIR=$(file_selector $mnt)
    
    elif [ $MENU = "E" ];then
        exit
    fi
    
}

当我输入 M 进入功能子菜单 form_data 时,它在启动时起作用,但如果我先进入其他子菜单则不起作用。我还使用了 if 语句而不是 case 因为我无法得到它,在启动时总是出错。 我的 form_data 函数是:

function form_data() { 
    auth=""
    serie=""
    tag=""
    ind="1"

    echo "form data" 
    exec 3>&1
    IFS=$'\n'
    VALUES=($(dialog --clear --ok-label "Submit" \
          --backtitle "Calibre" \
          --title "Manager" \
          --form "Add a book" \
        15 50 0 \
        "Author's name:" 1 1    "$auth"     1 20 30 0 \
        "Serie's name:"    2 1  "$serie"    2 20 30 0 \
        "Tag:"    3 1   "$tag"      3 20 30 0 \
        "Serie's index (int):"     4 1  "$ind"  4 20 30 0 \
        2>&1 1>&3))
    
    exec 3>&-
    main_menu
}

如您所见,我在最后调用了 main_menu,因为我想在提交表单时返回到它。很不确定这就是这样做的方法。

还有很多信息对话框无法正常工作。

function error() {
    dialog --clear --title "Error : " --msgbox $1 10 50
    sleep 1
    main_menu
}

最后的目标是调用 add_book 或 add_folder 函数来放入 calibre,我没有尝试,但我希望在对话框中显示进度条,但如果 calibredb 可以返回它的进度,我不会:

function add_folder() { 
    echo "add folder "
    echo $1
    echo ${VALUES[@]}
    nbBooks=$(find $1 -maxdepth 1 -type f | wc -l);
    listBooks=($(find $1 -maxdepth 1 -type f))
    for (( i; i<=$nbBooks; i++ )); do
            calibredb add -a "${VALUES[0]}" -s "${VALUES[1]}" -T "${VALUES[2]}" -S "$i" "${listBooks[$i]}" --with-library /home/gregory/books

    done
    main_menu
}

在经历了很多头痛之后,阅读文档,你们是我最后的希望来理解这个方法。 预先感谢。

bash user-interface dialog calibre
1个回答
0
投票

不要使用递归来重复主菜单,使用顶级循环。

function main_menu(){
    while :; do
        MENU=$(dialog --clear --title "Calibre" \
            --backtitle "Add Books" \
            --menu "What to do ?" \
            0 0 0 "C" "Choose a book or a folder" "M" "Enter metadata infos" "L" "Add selected Book(s)" "D" "Change default Directory for books" "E" "Exit" \
            2>&1 >/dev/tty)
        case "$MENU" in
        C)
            select=$(file_selector $mnt) ;;
        M)
            form_data ;;
        L)
            if [ -d "$select" ];then
                add_folder "$select"
            elif [ -f "$select" ];then
                if [[ "$select" == *.cbz || "$select" == *.pdf ]]; then
                    add_book "$select"
                else
                    error "Books should have extension .cbz or .pdf"
                fi
            else
                error "No file or folder selected"
            fi ;;
        D)
            NEWDIR=$(file_selector $mnt) ;;
        E) 
            exit ;;
        esac
    done    
}

那么你的其他函数应该简单地返回而不是调用

main_menu

© www.soinside.com 2019 - 2024. All rights reserved.