3

我不确定这里提出后续问题的政策是什么。所以,如果我违反协议,请原谅。早些时候我在 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 的内容。但是寻找数字不是更好吗?

先感谢您。

4

2 回答 2

2

我会做一些验证$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.
于 2009-11-11T05:12:00.903 回答
1

这就是我要工作的地方。主要区别在于添加了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
于 2009-11-11T04:52:23.660 回答