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

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

我一直在研究一个脚本,该脚本可以自动为 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

该脚本不以舍邦行,因此系统使用 执行它/bin/sh。在 Ubuntu 上,/bin/sh短跑,一个专为快速启动和执行而设计的 shell,仅具有标准功能。当 dash 到达第 68 行时,它看到一个语法错误:括号在上下文中对它没有任何意义。

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

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

答案2

对我来说,开始脚本是:

bash ./< script file > 

工作正常。

答案3

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

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

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

您有两种选择来确保脚本被解释bash

  1. 将 shebang 移至第一行

  2. sudo像这样运行:

     sudo bash ./pi_dev_env_install.sh
    

答案4

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

命令:

dos2unix script_file.sh script_file.sh

相关内容