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

Bash菜单:选择并执行后返回菜单?

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

    但是,在执行完该行后(例如,它显示了另一个文件),我想返回菜单,让用户选择另一个数字。包括退出菜单的零。

         dresult=`sed -n "$dumpline"p "$PWD"/"$myday1"_"$myjob".txt`
         $dresult
    

    3 回复  |  直到 16 年前
        1
  •  0
  •   dz.    16 年前

    这是另一种制作菜单的方法,它依赖于 cat 具有对文件行进行编号的能力(某些版本的 可能没有——如果是这样的话,请参阅第二个例子)。这两个例子都是一个简单的四项菜单:

    while [[ 1 ]]
    do
        cat -n menufile
        read -p "Make a selection " choice
        case $choice in 
            1|2) 
               echo "A or B"
               ;;
            3) 
               echo "C"
               ;;
            4) 
               break
               ;;
            *) 
               echo "Invalid choice"
               ;;
        esac
    done
    

    这不需要 cat -n :

    saveIFS="$IFS"
    IFS=$'\n'
    read -d '' -a menuarray < menufile
    IFS="$saveIFS"
    
    for (( i=0; i<${#menuarray[@]}; i++ ))
    do
        menu=$menu"$(($i+1))) ${menuarray[i]}"$'\n'
    done
    
    while [[ 1 ]]
    do
        echo "$menu"
        read -p "Make a selection " choice
        case $choice in 
            1|2) 
               echo "A or B"
               ;;
            3) 
               echo "C"
               ;;
            4) 
               break
               ;;
            *) 
               echo "Invalid choice"
               ;;
        esac
    done
    
        2
  •  2
  •   Dennis Williamson    16 年前

    我的评论 dz

    使用 seq select $dumpfile :

    ls
    echo 'hello'
    
    1) 1
    2) 2
    etc.
    

    saveIFS=$IFS
    IFS=$'\n'
    menu=$(< $dumpfile)
    PS3="Make a selection: "
    select ACTION in $menu QUIT
    do
        IFS=$saveIFS
        case ...
    
        3
  •  1
  •   Dennis Williamson    16 年前

    我认为,你需要一个循环。这是一个用于执行文件中选定行的小skelleton:

    #!/bin/bash
    
    dumpfile="bla.txt"
    
    echo "ls
    echo 'hello'" > ${dumpfile}
    
    function do_action {
        line="$( sed -n "${1},1p" "$dumpfile" )"
        (
            eval "${line}"
        )
    }
    
    cat -n $dumpfile
    nr=$( cat "${dumpfile}" | wc -l )
    PS3="select line nr or nr for QUIT: "
    select ACTION in $( seq "$nr" ) QUIT
    do
        case $ACTION in
            QUIT) echo "exit" ; break ;; #EXIT
            *) do_action "$ACTION" ;;
        esac
    done
    

    但请注意以下几点:

    推荐文章