Bash脚本、case语句和子菜单
我希望运行一个脚本,使用case语句在脚本之间的其他选项列表(子菜单排序)之间进行选择:Bash脚本、case语句和子菜单,bash,Bash,我希望运行一个脚本,使用case语句在脚本之间的其他选项列表(子菜单排序)之间进行选择: #!/bin/bash echo "Your choice ?" echo "1) Foo" echo "2) Bar" echo "3) Stuff" read case; case $case in #and this is where I would like to allow #(here a simplified example I do not manage to code) 1) W
#!/bin/bash
echo "Your choice ?"
echo "1) Foo"
echo "2) Bar"
echo "3) Stuff"
read case;
case $case in
#and this is where I would like to allow
#(here a simplified example I do not manage to code)
1) What script ? # may I use another case statement ?
a) Foo1;;
b) Foo2;;
2) What script ? # d°
a) Bar1;;
b) Bar2;;
c) Bar3;;
esac
Foo1、Foo2、Bar1、Bar2和Bar3实际上是bash脚本,我想从脚本中调用sh Foo1
我必须如何进行:
我可以在case语句中包含case语句吗(如果选项众多,则比if语句更好)?
如何从另一个脚本中调用脚本
提前谢谢你的帮助
ThG是的,您可以嵌套
case
语句。还应该考虑使用SELECT语句而不是所有的<代码> ECHOR> <代码>和<代码> Read < /Cord>语句。< /P>
options=("Option 1" "Option 2" "Option3" "Quit")
optionsprompt='Please enter your choice: '
sub1=("Option 1 sub 1" "Option 1 sub 2")
sub1prompt='Please enter your choice: '
PS3=$optionsprompt
select opt in "${options[@]}"
do
case $opt in
"Option 1")
echo "you chose choice 1"
PS3=$sub1prompt
select sub1opt in "${sub1[@]}"
do
case $sub1opt in
"Option 1 sub 1")
echo "you chose choice 2"
;;
"Option 1 sub 2")
echo "you chose choice 2"
;;
esac
done
;;
"Option 2")
echo "you chose choice 2"
;;
"Option 2")
echo "you chose choice 3"
;;
"Quit")
break
;;
*) echo invalid option;;
esac
done
第一级菜单如下所示:
1) Option 1
2) Option 2
3) Option3
4) Quit
Please enter your choice:
basedir=/some/path
case ...
...
$basedir/Foo # call the script
然而,这会很快变得毛茸茸的。最好将其分解为函数,其中内部select/case
语句位于单独的函数中,或者是抽象的,以便您可以传递参数来控制它们
要调用另一个脚本,您可能需要设置一个保存目录的变量。它看起来像这样:
1) Option 1
2) Option 2
3) Option3
4) Quit
Please enter your choice:
basedir=/some/path
case ...
...
$basedir/Foo # call the script
你应该做你想做的。为了说明如何使用函数来执行此操作,以便使脚本更具可读性:
function which_foo {
local foo_options=("foo1" "foo2" "cancel")
local PS3="Select foo: "
select foo in "${foo_options[@]}"
do
case $REPLY in
1) ./foo1.sh
break ;;
2) ./foo2.sh
break ;;
3) break ;;
esac
done
}
ACTIONS=("foo" "bar" "quit")
PS3="Select action: "
select action in "${ACTIONS[@]}"
do
case $action in
"foo") which_foo
break ;;
"bar") which_bar # Not present in this example
break ;;
"quit") break ;;
esac
done
另请注意:
- 在
中使用
,而不是在$REPLY
中使用
选项的文本,该选项自动设置为用户选择的数字
- 在每个
选项中使用案例
。如果没有它们,break
会将您置于循环中,因此会要求用户再次输入选项select
不会为您更改select
的值,因此在菜单的不同级别之间切换时,您必须自己进行操作PS3
local PS3
,这样就不必保存和恢复“全局”PS3的值。您还可以将FOO\u选项
放入函数中,并使其成为local
。使用$REPLY
而不是select
变量($action
在您的示例中)可以工作,但代码可读性较差。如果您使用break
,您可能仍然希望在其周围放置一个外部,以供某些使用。我不知道本地PS3
。我已经相应地更新了我的示例。谢谢你的提示,丹尼斯。@Dennis和@Rodrigue:想了想,绊倒了几次(例如,我忘了用chmod X写脚本…),多亏了你,两人最终都成功了。再次感谢