bash脚本案例语句无法使用对话框工作

时间:2019-04-11 17:23:05

标签: bash

我最近一直在尝试对话框和bash脚本。我创建了一个对话框菜单,其中包含三个选项:UsersPasswordsGroups,然后还有一个退出选项。我正在尝试在case语句中为每个函数运行函数,但是无论选择哪种方式,它似乎总会落在最后一个综合语句中并输出echo "Something Else..."语句,而不是在其中运行echo语句。相关功能,例如echo "Entering Users sub-menu"

我尝试通过以下方式运行此程序:

bash -x myscript

我得到以下输出:

+ choice='Users
Error: Expected a box option.
Use --help to list options.'
+ '[' 'Users
Error: Expected a box option.
Use --help to list options.' '!=' ' Quit ']'
+ case $choice in
+ echo 'Something else.  Where Am I?'
Something else. Where Am I?
+ exit 0

我仍在尝试弄清楚“ Expected a box option”的含义与对话框有关,但我也想知道bash中的if语句或case语句是否有问题。

我脚本的代码:

#!/bin/bash

function quit {
    exit 0
}

function menu {

choice=$(dialog --backtitle "Rob Graves's Bash Scripting" \
--title "Main Menu"  --menu "Choose one" 30 50 4 "Users" \
"- Do something with users" "Passwords"\
 "- Do stuff with passwords"  "Groups" "- Do things with groups" \
 "Quit" "- Exit to desktop" --clear --nocancel 3>&1 1>&2 2>&3)

    if [ "$choice" != "Quit" ]; then

        case $choice in 
            Users)
                users                   #calls users function
                ;;
            Passwords)
                passwords               #calls passwords function
                ;;
            Groups)
                groups                  #calls groups function
                ;;
            *)
                echo "Something else.  Where Am I?"
                ;;
        esac

    else
        echo "Quitting..."
        quit
    fi

}

function users {
    echo "Entering Users sub-menu"
}

function passwords {
    echo "Entering Passwords sub-menu "
}

function groups {
    echo "Entering Groups sub-menu"

menu

exit 0

1 个答案:

答案 0 :(得分:6)

您的直接选择似乎是dialog命令与您最后提到的选项--clear--nocancel一样,不是 。重新排序似乎可以正常工作

choice=$(dialog --backtitle "Rob Graves's Bash Scripting" \
                --title     "Main Menu" \
                --clear \
                --nocancel \
                --menu  "Choose one" 30 50 4 \
                "Users"     "- Do something with users" \
                "Passwords" "- Do stuff with passwords" \
                "Groups"    "- Do things with groups" \
                "Quit"      "- Exit to desktop" 3>&1 1>&2 2>&3)

同样最好始终如下引用case选项字符串

case "$choice" in
    "Users")
        users                   #calls users function
        ;;
    "Passwords")
        passwords               #calls passwords function
        ;;
    "Groups")
        groups                  #calls groups function
        ;;
    *)
        echo "Something else.  Where Am I?"
esac

还请记住,您还可以在"Users"菜单和"1 - Users"菜单中为dialogcase添加选项,如下所示。

enter image description here

,并在case语句中为

case "$choice" in
    "1 - Users")

还要注意,命令users(1)groups(1)是作为GNU bash的一部分可用的标准命令,对函数使用相同的名称可能会带来不确定性。始终选择明确的名称。

请记住,在脚本失败的情况下,使用非零退出代码退出脚本。例如在上述默认情况下,请记住添加一个exit 1,以便在脚本异常退出时 not 不能按预期的顺序运行时,添加一种其他的调试工具来查找。

    *)
        echo "Something else.  Where Am I?"
        exit 1
        ;;

点击此键并且脚本退出并执行echo $?时,将会显示返回的代码。

还从脚本的函数定义中删除非标准function关键字。只要脚本在bash外壳程序中运行,就可以了,在纯POSIX外壳程序上,可能无法识别该关键字。

对于portability,您还应该使用 #!/usr/bin/env bash :不同的* nixes将bash放在不同的位置,而使用/usr/bin/env是一种解决方法运行在bash上找到的第一个PATH