【问题标题】:Bash - error message 'Syntax error: "(" unexpected'Bash - 错误消息'语法错误:“(”意外'
【发布时间】:2011-09-14 21:11:55
【问题描述】:

由于某种原因,此功能运行正常。终端正在输出中

newbootstrap.sh:2:语法错误:“(”意外

这是我的代码(第 2 行是函数 MoveToTarget() {

#!/bin/bash
function MoveToTarget() {
    # This takes two arguments: source and target
    cp -r -f "$1" "$2"
    rm -r -f "$1"
}

function WaitForProcessToEnd() {
    # This takes one argument. The PID to wait for
    # Unlike the AutoIt version, this sleeps for one second
    while [ $(kill -0 "$1") ]; do
        sleep 1
    done
}

function RunApplication() {
    # This takes one application, the path to the thing to execute
    exec "$1"
}

# Our main code block
pid="$1"
SourcePath="$2"
DestPath="$3"
ToExecute="$4"
WaitForProcessToEnd $pid
MoveToTarget $SourcePath, $DestPath
RunApplication $ToExecute
exit

【问题讨论】:

  • Re"这个函数工作正常":你不是说"这个函数是 不是 正常工作”(我的重点)?
  • 好的,OP 在 10 多年前离开了大楼。

标签: linux macos bash scripting syntax-error


【解决方案1】:

您使用错误的语法来声明函数。改用这个:

MoveToTarget() {
    # Function
}

或者这个:

function MoveToTarget {
    # function
}

但不是两者兼而有之。

另外,我看到稍后您使用逗号分隔参数 (MoveToTarget $SourcePath, $DestPath)。这也是一个问题。 Bash 使用空格来分隔参数,而不是逗号。去掉逗号,你应该是金色的。

【讨论】:

  • 谢谢!现在说得通了。我看到了一些这样做的网站。
  • @rsmith 为网站命名,否则这是一个梦想 :-)
  • 参见 stackoverflow.com/questions/7917018/… 中的 cmets “function”关键字不符合 POSIX,参见 bash man page 中的“Shell 函数定义”
  • 还要注意空函数体是不允许的,这是最令人困惑的部分(因为有人可能会缩小范围以测试空体但仍然无法工作),请参阅stackoverflow.com/questions/39307615/…
  • 另外sh 可能符号链接到/bin/dash,你需要以bash 运行它。
【解决方案2】:

我也是在 Bash 脚本中定义函数的新手。我在Ubuntu 14.04 (Trusty Tahr) 上使用版本 4.3.11(1):-release (x86_64-pc-linux-gnu) 的 Bash。

我不知道为什么,但是以关键字 function 开头的定义对我来说永远不起作用。

如下定义

function check_and_start {
  echo Hello
}

产生错误信息:

语法错误:“}”意外

如果我将{ 放在新行上,例如:

function my_function
{
    echo Hello.
}

当我运行脚本时它会打印一个Hello.,即使我根本不调用这个函数,这也是我们想要的。

我不知道为什么这行不通,因为我也看了很多教程,他们都把大括号放在第一行的末尾。也许是我们使用的 Bash 版本??不管怎样,把它放在这里供你参考。

我必须使用 C 风格的函数定义:

check_and_start() {
  echo $1
}

check_and_start World!
check_and_start Hello,\ World!

它按预期工作。

【讨论】:

  • 我也有同样的问题。删除单词 function 并添加 paran 也对我有用。我注意到这两种函数风格都可以在 OS X 上正常工作。虽然我的 OS X 运行的是旧版本的 bash。
【解决方案3】:

我有同样的问题。我有时使用sh vs. Dash 在 Ubuntu 上运行脚本。似乎使用 sh 运行脚本会导致问题,但使用 Dash 运行脚本可以正常工作。

【讨论】:

  • 为什么不一样? /bin/sh 不是指向dash(符号链接)吗?
【解决方案4】:

如果遇到“语法错误:”(“意外”,则使用“bash”而不是使用“sh”。

例如:

bash install.sh 

【讨论】:

  • 如果你的脚本被其他东西调用,那将无济于事,例如Git hooks 预提交脚本。
  • 替代方案:从which bash 获取信息并使用例如#!/usr/bin/bash 而不是#!/bin/sh
  • #!/bin/bash 也可以工作(因为/bin 可能只是指向/bin/usr)。
  • /bin/sh 可能指向 Dash (dash) - 在 Ubuntu MATE 20.04 (Focal Fossa) 上观察到。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 2011-09-16
  • 2018-08-03
相关资源
最近更新 更多