我正在尝试配置名为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
上的单引号更改为和其他一些东西。我迷路了,不明白为什么这个脚本不起作用。
答案 0 :(得分:3)
此错误是由于脚本中\
之后出现&&
引起的。
反斜杠使下一个字符不被外壳解释。如果下一个字符是换行符,那么外壳程序不会将换行符解释为命令的结尾。它有效地允许命令跨越多行。还要注意,在以这种方式分解的行上,\
后面没有任何内容(甚至没有评论或单个空格)。
例如ls; \ if true; then echo "Hi"; fi;
,也会产生与您相同的错误,但是如果您将如下所示的错误放在脚本中,则不会产生错误。
ls; \
if true; then echo "Hi"; fi;
如下来自 @ glenn-jackman 的评论指出,bash与then
有问题的原因是前面没有if
,而是有一个命令名为" if"
。
此外,脚本中的\
之后不需要&&
。在明显存在未终止命令(&&, ||, |, &, ;
)的某些情况下,将忽略换行符。有关更多信息,请参见here。