我最近一直在尝试对话框和bash脚本。我创建了一个对话框菜单,其中包含三个选项:Users
,Passwords
和Groups
,然后还有一个退出选项。我正在尝试在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
答案 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"
菜单中为dialog
和case
添加选项,如下所示。
,并在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
。