如何解决“意外令牌'then'”的语法错误?

时间:2019-08-16 13:00:53

标签: bash syntax raspberry-pi vpn

我正在尝试配置名为ZeroTier的VPN以在Raspberry Pi上运行。我用于安装的Bash脚本是:

curl -s 'https://pgp.mit.edu/pks/lookup?op=get&search=0x1657198823E52A61' | gpg --import && \ if z=$(curl -s 'https://install.zerotier.com/' | gpg); then echo "$z" | sudo bash; fi

哪个会吸引我:

  

-bash:意外令牌'then'附近的语法错误

我一直在处理;前后{the}和)之间的空格,然后放在分号上,将$z上的单引号更改为和其他一些东西。我迷路了,不明白为什么这个脚本不起作用。

1 个答案:

答案 0 :(得分:3)

此错误是由于脚本中\之后出现&&引起的。

反斜杠使下一个字符不被外壳解释。如果下一个字符是换行符,那么外壳程序不会将换行符解释为命令的结尾。它有效地允许命令跨越多行。还要注意,在以这种方式分解的行上,\后面没有任何内容(甚至没有评论或单个空格)。

例如ls; \ if true; then echo "Hi"; fi;,也会产生与您相同的错误,但是如果您将如下所示的错误放在脚本中,则不会产生错误。

ls; \
if true; then echo "Hi"; fi;

如下来自 @ glenn-jackman 的评论指出,bash与then有问题的原因是前面没有if,而是有一个命令名为" if"

此外,脚本中的\之后不需要&&。在明显存在未终止命令(&&, ||, |, &, ;)的某些情况下,将忽略换行符。有关更多信息,请参见here