语法错误:“(”意外(预期“然后”)
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 括号是特殊字符,需要用反斜杠转义。我发现当事情被分开时更容易阅读。
现在我遇到了同样的问题,我需要使用正则表达式,我无法将其包含在简单的值检查中。我该如何解决?以上是关于语法错误:“(”意外(预期“然后”)的主要内容,如果未能解决你的问题,请参考以下文章