Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash脚本、case语句和子菜单_Bash - Fatal编程技术网

Bash脚本、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

我希望运行一个脚本,使用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) 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
    的值,因此在菜单的不同级别之间切换时,您必须自己进行操作

要从脚本中调用脚本,只需调用另一个脚本的名称,就像从命令行调用脚本一样。非常感谢您的快速回答。不过,我还没有“领会”它;我需要仔细考虑一下(这意味着作为一名学习者,我必须先做一些家庭作业……);我一理解(希望不要花太多时间)和@Rodrigue:仔细考虑后,绊倒了几次(例如,我忘了为我的脚本使用chmod X…),然后感谢你,两人最终都成功了。再次感谢你也感谢你(见我对丹尼斯的“回答”。。。同样的答案+1用于显示变化和提供更多细节。您可以在函数中使用
local PS3
,这样就不必保存和恢复“全局”PS3的值。您还可以将
FOO\u选项
放入函数中,并使其成为
local
。使用
$REPLY
而不是
select
变量(
$action
在您的示例中)可以工作,但代码可读性较差。如果您使用
break
,您可能仍然希望在其周围放置一个外部
,以供某些使用。我不知道
本地PS3
。我已经相应地更新了我的示例。谢谢你的提示,丹尼斯。@Dennis和@Rodrigue:想了想,绊倒了几次(例如,我忘了用chmod X写脚本…),多亏了你,两人最终都成功了。再次感谢