Bash Case菜单-动态选项

Bash Case菜单-动态选项,bash,menu,case,Bash,Menu,Case,我不确定在提出后续问题方面的政策是什么。所以如果我违反了协议,请原谅。早些时候,我在bash()中构建菜单 到目前为止,我的工作非常好。代码在这里 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] ) dtvari

我不确定在提出后续问题方面的政策是什么。所以如果我违反了协议,请原谅。早些时候,我在bash()中构建菜单

到目前为止,我的工作非常好。代码在这里

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的东西。但寻找数字不是更好吗


提前谢谢你。

这是我要做的工作。主要区别在于添加了
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

我会对
$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.
案例中的$choice
#检查数字
+([0-9]))
行=($(wc-l))

如果((choice>0&&choice,谢谢,它在“+”([0-9])旁边的意外标记“(”错误)附近抛出语法错误,我看不到任何额外的空格或任何其他内容。仍在查找。是否确保添加extglob?没有它,它将无法工作,因为+(…)语法是由extglob启用的。谢谢Dennis。我没有使用extglob部分,它的测试非常棒。