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

rob*_*ves 7 bash

最近,我一直在尝试对话框和bash脚本。我创建了一个对话菜单有三个选项:UsersPasswords,和Groups随后也戒烟选项。我试图在一个case语句中为每个函数运行函数,但是它似乎总是落在最后的全部语句中并输出该echo "Something Else..."语句,而不管我选择哪个选项,而不是说在相关函数中运行echo语句,例如echo "Entering Users sub-menu"

我试过使用以下命令进行调试:

bash -x myscript
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

+ 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
Run Code Online (Sandbox Code Playgroud)

我仍在尝试弄清楚“ 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
Run Code Online (Sandbox Code Playgroud)

Ini*_*ian 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)
Run Code Online (Sandbox Code Playgroud)

同样最好总是如下引用您的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
Run Code Online (Sandbox Code Playgroud)

还记得你还可以添加选项"Users""1 - Users"在这两个dialog菜单,并在case菜单如下。

在此处输入图片说明

case声明为

case "$choice" in
    "1 - Users")
Run Code Online (Sandbox Code Playgroud)

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

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

    *)
        echo "Something else.  Where Am I?"
        exit 1
        ;;
Run Code Online (Sandbox Code Playgroud)

当这被击中并且您的脚本退出执行时,echo $?将会显示返回的代码。

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

您还应该使用#!/usr/bin/env bash便携性:不同的* nixes放在bash不同的地方,并使用/usr/bin/env是运行第一种解决方法bash上找到PATH