最近,我一直在尝试对话框和bash脚本。我创建了一个对话菜单有三个选项:Users,Passwords,和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)
你直接的选择似乎是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。