大家好,我是 Bash 脚本的新手,请求您的帮助。我正在尝试循环子菜单以返回到 Glassfish 中的主菜单。我正在使用 if 语句。
我希望我的脚本返回主菜单
#!/bin/bash
asadmin=/glassfish/bin/asadmin
echo "This is a console"
echo
echo "1. List Domains"
echo
echo "2. Start Domain"
echo
echo "3. Stop Domain"
echo
echo
echo "Choice:"
read answer
if [ $answer == '1' ]
then
$asadmin list-domains
fi
if [ $answer == '2' ]
then
echo "domain1"
echo "domain2"
read startdomainanswer
$asadmin start-domain $startdomainanswer
fi
if [ $answer == '3' ]
then
echo "domain1"
echo "domain2"
read stopdomainanswer
$asadmin stop-domain $stopdomainanswer
fi
答案1
您目前有不循环,甚至不是任何类型的循环。
您的脚本运行,在选择命令处等待您,然后在最后退出。错觉循环的创建方式是递归再次调用 asadmin,还在选择命令处等待您,然后自行在末尾退出。
我的第一个建议是在脚本中添加一个“退出”选项,然后添加一个 while 循环来不断运行,要求执行某项操作,直到您选择该“退出”选项。
echo "This is a console"
while [ 1 ]
do
echo "Choice:"
read answer
case answer in
1 )
. . .
2 )
. . .
x )
exit
;;
esac
done
我的第二建议(我过去也这样做过)将操作与“菜单”脚本完全分开。从 [菜单] 中读取选项文件并简单地将您正在读取的文件的名称更改为在菜单之间“移动”。
例如,使用这些“菜单”文件:
[main.menu]
1:List Domains:asadmin list-domains
2:Start Domain:@start
3:Stop Domain:@stop
x:Exit:EXIT
[start.menu]
1:Domain 1:asdamin start-domain Domain1
2:Domain 2:asdamin start-domain Domain2
x:Return:@main
[stop.menu]
1:Domain 1:asdamin stop-domain Domain1
2:Domain 2:asdamin stop-domain Domain2
x:Return:@main
您可以创建如下脚本:
[asmenu.bash]
$! /bin/bash
$MENU_FILE="${1:-main}.menu"
while [ 1 ]
do
echo "${MENU_FILE}"
echo " "
# Print Menu items - Choice number and description
awk -F':' '{print $1, $2}' "${MENU_FILE}"
echo " "
echo "Choice:"
read CHOICE
# Extract the third element (command or menu name)
ACTION=$( awk -F':' '/^'${CHOICE}':/' {print $3}' "${MENU_FILE}" )
if [ "EXIT" = "${ACTION}" ] ; then
exit ' End the menu Script
fi
if [ "${ACTION}" =~ ^@ ] ; then
# Leading at symbol implies a menu name
MENU_FILE="${ACTION:1}.menu"
else
# Otherwise it's a command to execute
${ACTION}
fi
done
哪一个(如果我写得正确的话)应该做这样的事情,比如说,启动你的第二个域:
/* Start of run */
main.menu
1 List Domains
2 Start Domain
3 Stop Domain
x Exit
Choice: 2
start.menu
1 Domain 1
2 Domain 2
x Return
Choice: 2
/* execution of asadmin start-domain Domain2 */
start.menu
1 Domain 1
2 Domain 2
x Return
Choice: x
main.menu
1 List Domains
2 Start Domain
3 Stop Domain
x Exit
Choice: x
/* end of run */