Bash脚本:循环执行后始终显示菜单

6

I'm using a bash script menu like this:

#!/bin/bash
PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
done

每次选择菜单后,我只会得到提示:

Please enter your choice:

我该如何在每个选项执行完成后始终显示菜单?我查了一些资料,我认为可以采用while循环的方式,但是我还没有能够让任何东西起作用。

1
展示一下你尝试过的,这样我们才能帮你解决问题。 - Mat
4个回答

18

让它美观且易于使用 ;-)

#!/bin/bash

while :
do
    clear
    cat<<EOF
    ==============================
    Menusystem experiment
    ------------------------------
    Please enter your choice:

    Option (1)
    Option (2)
    Option (3)
           (Q)uit
    ------------------------------
EOF
    read -n1 -s
    case "$REPLY" in
    "1")  echo "you chose choice 1" ;;
    "2")  echo "you chose choice 2" ;;
    "3")  echo "you chose choice 3" ;;
    "Q")  exit                      ;;
    "q")  echo "case sensitive!!"   ;; 
     * )  echo "invalid option"     ;;
    esac
    sleep 1
done

用函数调用或调用其他脚本替换这个示例中的回显。


7

我刚刚修改了你的脚本,像下面这样。对我有效!

 #!/bin/bash
 while true
 do
 PS3='Please enter your choice: '
 options=("Option 1" "Option 2" "Option 3" "Quit")
 select opt in "${options[@]}" 
 do
     case $opt in
         "Option 1")
             echo "you chose choice 1"
             break
             ;;
         "Option 2")
             echo "you chose choice 2"
             break
             ;;
         "Option 3")
             echo "you chose choice 3"
             break
             ;;
         "Quit")
             echo "Thank You..."                 
             exit
             ;;
         *) echo invalid option;;
     esac
 done
 done

0

你也可以这样做:

#!/bin/bash

PS3='Please enter your choice: '
options=("Option 1" "Option 2" "Option 3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option;;
    esac
    counter=1
    SAVEIFS=$IFS
    IFS=$(echo -en "\n\b")   # we set another delimiter, see also: https://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
    for i in ${options[@]};
    do
        echo $counter')' $i
        let 'counter+=1'
    done
    IFS=$SAVEIFS
done

0

你可以通过在esac之后将REPLY变量设置为空来实现这一点。

使用你的代码示例:

#!/usr/bin/env bash

PS3="Please enter your choice: "
options=("Option 1" "Option 2" "Option3" "Quit")
select opt in "${options[@]}"
do
    case $opt in
        "Option 1")
            echo "you chose choice 1"
            ;;
        "Option 2")
            echo "you chose choice 2"
            ;;
        "Option 3")
            echo "you chose choice 3"
            ;;
        "Quit")
            break
            ;;
        *) echo invalid option ;;
    esac
    REPLY=
done

另一个例子(更简单易懂的版本):

#!/usr/bin/env bash

select animal in dog duck cat bird quit ; do
    case $animal in
        dog)  echo "i'm a dog!" ;;
        duck) echo "i'm a duck!" ;;
        cat)  echo "i'm a cat!" ;;
        bird) echo "i'm a bird!" ;;
        quit) echo "bye" ; break ;;
        *)    echo "unknown animal, please try again..." ;;
    esac
    REPLY=
done

如需解释,请参阅GNU bash文档有关条件结构-选择的部分


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接