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

时间:2009-11-02 07:09:04

标签: bash menu sed

我有一个写入文件的bash脚本。在脚本的最后我想显示一个带有行号的菜单 - 并让用户能够选择1或2,(等到文件中的行数)然后让它执行该行。 / p>

到此为止是完美的。

然而,在执行该行之后(例如,它显示另一个文件。)我想返回菜单并让用户选择另一个号码。包括退出菜单的零。

显示菜单后,我有以下内容。 (dumpline是读取文件的行)

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

但是现在 - 在运行变量$ dresult之后 - 它会退出shell(而不是我喜欢显示的菜单。

有什么想法吗?

提前谢谢。

3 个答案:

答案 0 :(得分:2)

这是另一种做依赖于cat能够对文件行进行编号的菜单的方法(某些版本的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

答案 1 :(得分:1)

我对 dz 的回答评论太长,无法发表评论,所以我在这里发帖:

seqselect一起使用会产生一个看起来多余的菜单,而它与$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 ...

答案 2 :(得分:0)

我想,你需要像循环一样的东西。这是一个用于从文件执行选定行的小型骨架:

#!/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

但请注意以下事项:

  • 使用eval可能并不总是一个好主意(逃避很难)。有时$ line就足够了。
  • 使用子shell可以通过执行文件行来防止更改变量。它还可以防止从通常退出shell的行退出脚本。