语法错误:“(”意外(预期“然后”)

Posted

技术标签:

【中文标题】语法错误:“(”意外(预期“然后”)【英文标题】:Syntax error: "(" unexpected (expecting "then") 【发布时间】:2016-06-04 13:50:13 【问题描述】:

我在使用 bash 脚本时遇到问题。我正在尝试通过 ssh 将文件发送到我的树莓派的过程自动化。我想提示输入文件/目录的路径,然后将其复制到我的 pi 上的 /home/pi/push 目录。然后我想问是否还有其他文件要发送,如果是,则再次循环,否则退出程序。出于明显的安全原因,我将 IP 地址归零。

done=0
while [ $done -lt 1 ]
do
    read -r -p "Path to file: " path
    spawn scp -r $path pi@000.00.000.00:/home/pi/push
    expect "assword:"
    send "password\r"
    interact

    read -r -p "Send another? [y/N] " response
    if [[ $response =~ ^([yY][eE][sS]|[yY])$ ]]
    then
        $done=1
    else
        echo "Ending file transfer."
    fi
done

如果您对实现此目标的更好方法有建议,那也太好了!

【问题讨论】:

请看:shellcheck.net 这里的spawn 让我担心——那是expect 关键字,而不是shell 关键字。您不能像在这里尝试的那样混合语言——它们是两种截然不同的解释器,具有两种截然不同的语法。 好点@CharlesDuffy。看看设置public key authentication to your Pi以避免密码输入。 立即失败的原因是脚本是用sh而不是bash运行的,顺便说一下。 感谢@CharlesDuffy 的提醒。我不知道expect 完全是另一回事。我会做出适当的改变! 【参考方案1】:

只需在测试中使用or,或在正则表达式中转义括号。此外,没有必要测试 nocasematch 设置的案例;有了这个要求,你甚至不需要正则表达式。

shopt -s nocasematch
...
if [[ "$response" = "yes" || "$response" = "y" ]]

【讨论】:

执行该检查的 POSIX 标准方法是使用 case 语句。 case $response in [Yy][Ee][Ss]|[Yy]) done=1 ;; *) echo "Ending file transfer." ;; esac ...也就是说,这里有一个更大的问题,因为 OP 试图在 shell 脚本中使用 expect 语法。 非常感谢@miken32!奇迹般有效。你能向我解释为什么旧方法不起作用吗?我刚刚开始学习这些东西。 @AnthonyMottaz 括号是特殊字符,需要用反斜杠转义。我发现当事情被分开时更容易阅读。 现在我遇到了同样的问题,我需要使用正则表达式,我无法将其包含在简单的值检查中。我该如何解决?

以上是关于语法错误:“(”意外(预期“然后”)的主要内容,如果未能解决你的问题,请参考以下文章

语法错误:bash 脚本中的“fi”意外(预期“then”)

GraphQLError:语法错误:无法解析意外字符“。”

php错误<b>解析错误</b>:语法错误,意外':'在

语法错误;意外符号:

解析错误:语法错误,文件意外结束,期待'`' [重复]

从文本文件加载 Json 对象 - 返回未捕获的语法错误:意外标记“[”