代码之家  ›  专栏  ›  技术社区  ›  Chasester

bash case菜单-动态选择

  •  3
  • Chasester  · 技术社区  · 16 年前

    我不知道在这里提出后续问题的政策是什么。所以,如果我违反了协议,请原谅我。早些时候我在巴什做菜单( Here )

    到目前为止,我已经做得很好了。代码在这里。

    while [[ 1 ]]
    do
        cat -n "$dumpfile"
        read -p "Please make a selection, select q to quit: " choice
        case $choice in
                # Check for digits
        [0-9] )   dtvariable=$(sed -n "$choice"p "$dumpfile")
                  $dtvariable            ;;
         q|Q)
             break
               ;;
          *)
               echo "Invalid choice"
               ;;
        esac
    done
    

    除了-这对最多9个菜单项很有用。菜单将是动态的-可以有1个项目、20个项目或197个项目。我试着把[0-9]改成[0-9][0-9]看看是否需要12个。但事实并非如此。有人能让我走上正确的道路吗?我想我可以把[0-9]部分去掉,取任何非Q的部分,但寻找数字不是更好吗?

    提前谢谢。

    2 回复  |  直到 16 年前
        1
  •  2
  •   Dennis Williamson    16 年前

    我会做一些验证 $choice 以下内容:

    case $choice in
         # Check for digits
        +([0-9]))
            lines=($(wc -l ))
            if (( choice > 0 && choice <= lines ))
            then
                dtvariable=$(sed -n "$choice"p "$dumpfile")
                $dtvariable            ;;
            fi
    # etc.
    
        2
  •  1
  •   Jim Garrison    16 年前

    这就是我要做的。主要区别在于 shopt -s extglob ,打开扩展模式匹配,然后 +([0-9]) 模式,其中 bash是否等价于正则表达式 [0-9]+

    shopt -s extglob
    while [[ 1 ]]
    do
        read -p "Please make a selection, select q to quit: " choice
        case $choice in
                # Check for digits
        +([0-9]))  
             echo $choice ;;
         q|Q)
             break
               ;;
          *)
               echo "Invalid choice"
               ;;
        esac
    done