是什么导致了“意外标记‘do’附近的语法错误”以及如何修复它?

是什么导致了“意外标记‘do’附近的语法错误”以及如何修复它?

我不断收到此错误:

./install.sh 
./install.sh: line 28: syntax error near unexpected token `do'
./install.sh: line 28: `                do'

运行此代码时(正在进行的工作):

# Set the prompt string:
PS3='Choose folder: ';

function choose() {

    # This works:
    #select folder;
    #do test -n "$folder" && echo You chose: $REPLY\) $folder && break;
    #echo 'Wrong entry, try again.';
    #continue;
    #done;

    select folder;
    do
        case $folder in
            'q')
                echo 'Exiting …';
                break;
                ;;
            *)
                do
                    test -n '$folder' && echo You chose: $REPLY\) $folder && break;
                    echo 'Wrong entry, try again.';
                    continue;
                done;
                ;;
        esac;
    done;

}

# Switch to glob folder location:
cd ~/Desktop;

# Create menu:
choose foo*;

# Do stuff with result of choose() here ...

# Exit program:
exit 0;

正如您可能从上面看到的,我正在尝试创建一个菜单,让我从全局文件夹列表中进行选择;不幸的是,我不明白为什么我的嵌套do会产生我上面发布的错误。

最好,用户可以从目录列表中进行选择;如果他们输入q,则程序退出;如果他们做出无效选择,程序会让他们再次选择,直到他们选择有效选择(或输入q退出)。

我还没有完全弄清楚退出部分,但在我做到这一点之前,我需要克服这个do语句错误。

问题: 是什么原因造成的syntax error near unexpected token `do'以及如何解决?

答案1

缺少循环条件

您的语法无效。您的代码可能还存在其他问题,但此消息可能来自这样的事实:您不能do像块一样使用关键字;您还需要有循环条件之一。

您目前拥有:

        *)
            do
                test -n '$folder' && echo You chose: $REPLY\) $folder && break;
                echo 'Wrong entry, try again.';
                continue;
            done;
            ;;

您缺少启动循环的forwhile、 或关键字。until

答案2

一般来说,当我遇到这种类型的错误(不匹配的 if/else、do、while 等)并且找不到有问题的代码时,我会备份脚本并开始删除任何块之间的代码块,直到我找到只要有一个控制结构的骨架,通常可以帮助我找到丢失的关键字。

相关内容