Shell脚本失败:语法错误:“(”意外


64

我一直在研究一个脚本,该脚本可以自动为Raspberry Pi开发设置开发环境(有关工作的逐步详细信息,请参见此处)。该脚本已在该文章中链接,但为方便起见,您也可以在此处找到它。现在,当运行此脚本时,将安装并正确设置环境,但是由于sudo的默认超时值,您必须多次输入sudo密码。因此,我开始进行实验,删除所有sudo行,然后在命令行通过sudo运行整个脚本,如下所示:

kemra102@ubuntuvm:~$ sudo ./pi_dev_env_install.sh

这可以按预期工作,并且可以完成大部分工作:

./pi_dev_env_install: 68: ./pi_dev_env_install.sh: Syntax error: "(" unexpected

现在,当不使用sudo运行整个脚本时,此行以前可以正常工作。以sudo运行的这条线没有什么可以阻止它工作,据我所知,有人有任何想法吗?


1
shebang真的在9号线吗?由于Ubuntu的DashAsBinSh相似性,我怀疑您的脚本由dash而不是解释bash。尝试将
Shebang

根据那篇文章,直接调用/ bin / bash而不是/ bin / sh将;正确使用bash而不是破折号,这样就我所知应该不是问题。当然,我仍然可以移动shebang,但这并不能真正解释为什么当您不使用整个脚本时它为何起作用。
kemra102

就我而言,一切都很好,但是作为一种习惯,我使用“ sh”而不是“ bash”运行shell脚本。
Indrajeet Gour '18 -10-11

Answers:


82

该脚本不是以shebang行开头,因此系统使用来执行/bin/sh。在Ubuntu上/bin/shdash,它是一种仅具有标准功能而旨在快速启动和执行的外壳。当破折号到达第68行时,它会看到语法错误:括号在上下文中对它没有任何意义。

由于破折号(像所有其他shell一样)是解释器,因此在执行到达有问题的行之前它不会抱怨。因此,即使脚本在测试的某个时刻成功启动,一旦到达第68行,该脚本也将中止。

shebang行必须是文件中的第一件事。由于您使用bash功能,因此文件的第一行必须为#!/bin/bash#!/usr/bin/env bash


2
显然,由于我的知识上有差距,我没有编写太多脚本,因此没有意识到!感谢您的解释,它对我们很有帮助,将来也将非常有用。
kemra102

让我补充一点,即使将脚本扩展程序用于鹦鹉螺时也会发生此错误。添加shebang行即可立即解决。+1。
Bhavin Doshi

面对sonarqube.sh在Ubuntu 15.10 上运行的问题。如前所述更改标题。正在执行sudo sh ./sonar.sh console。仍然出现错误。
soufrk's

@soufrk是sonarqube.sh还是sonar.sh?下定决心 而且,无论如何,如果您无法使用该线程中的信息解决问题,请使用脚本的全部内容提出一个新问题,然后复制并粘贴完整的错误消息。
吉尔斯(Gilles)

我的错 !!正在运行错误的arch可执行文件。但有趣的是,在正确的拱门上,文件从头开始#! /bin/sh完美执行。现在,这让我感到困惑。
soufrk's

6

如果shebang不在第一行,则无论root用户的外壳,SHELL变量或-s标志如何,都不会受到尊重。您可以通过一个简单的示例轻松确认这一点:

#
#!/bin/bash
offfset=(`ls`)
echo $offset

使用sudo运行该脚本将在Ubuntu和Debian的最新版本中引发语法错误。

您有两个选择可确保脚本由bash以下语言解释:

  1. 将shebang移至第一行

  2. sudo像这样运行:

    sudo bash ./pi_dev_env_install.sh

1

对我来说,启动脚本有:

bash ./< script file > 

工作正常。


对您而言,这可能是正确的,但实际上并非解决上述问题的解决方案。
bu5hman


0

在脚本文件中尝试dos2unix。有时,源中有一些隐藏的字符。

命令:

dos2unix script_file.sh script_file.sh

0

如果您覆盖了预期的解释器,则会发生这种情况。例如,无论使用什么哈希爆炸,此命令都将与sh一起运行(不使用哈希爆炸时非常方便):

> sh run.sh

或运行bash:

> bash run.sh

要使其使用脚本定义的哈希爆炸值,请使用以下命令:

> ./run.sh

-1
sudo chmod 755 <script>

就我而言,错误是缺少执行文件的权限。当我分离命令时,仅收到错误消息:

$ sudo sh
# ./install

缺少权限不会导致此错误消息。
吉尔斯2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.