选择选项后,选择未完成

时间:2016-02-10 17:15:47

标签: bash select couchpotato

我正在编写一个脚本来备份我的CouchPotatoServer,但我遇到了问题。

以下是我遇到问题的代码:

select OPTION in Backup Restore Finish; do
    echo "You choose $OPTION CouchPotatoServer settings";
    case $OPTION in
        Backup)
            echo "Backing up settings file to $CPBPATH:";
            cp $CPSPATH/settings.conf $CPBPATH/settings-"$(date +%Y%m%d-%H%M)".bak ;
            echo "Done!"
            break
            ;;
        Restore)
            echo "Please choose a backup to restore settings" ;
            AVAILABLEFILES="($(find $CPBPATH -maxdepth 1 -print0 | xargs -0))"
            select FILE in $AVAILABLEFILES; do
                cp "$FILE" $CPSPATH/settings.conf ;
                echo "restored $FILE"
                break
                ;;
done

问题是,在用户选择一个选项并执行代码后,它会一直等待新的选择,但我希望它退出。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

break退出循环,但是你有嵌套循环并且卡在外部循环中。 break实际上需要一个参数来指定要退出的封闭循环数,因此当您将break替换为break 2时,您还将退出外部select循环

这是一个用于演示break语句中不同select级别的小脚本:

#!/bin/bash

PS3="Outer selection: "
select option1 in outer1 outer2 ; do
    echo "option1 is $option1"
    PS3="Inner selection: "
    case "$option1" in
        outer1)
            select option2 in inner1 inner2; do
                echo "option2 is $option2, issuing 'break'"
                PS3="Outer selection: "
                break
            done
            ;;
        outer2)
            select option2 in inner3 inner4; do
                echo "option2 is $option2, issuing 'break 2'"
                break 2
            done
            ;;
    esac
done

PS3是使用select语句时显示的提示。只要外部选项为outer1,您就会循环回到外部select,因为只会发出一个break;如果您选择outer2,则会使用break 2退出该计划。