Bash - 错误信息 'Syntax error: "(" unexpected'(Bash-错误信息:“语法错误:'('意外”)

16

由于某些原因,这个函数没有正常工作。终端输出:

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

关于“这个函数正常工作”的问题:你是不是应该说“这个函数正常工作”(我强调了一下)? - Peter Mortensen
1
好的,OP离开大厦已经超过10年了。 - Peter Mortensen
4个回答

36

你使用的函数声明语法有误,请改用以下语法:

MoveToTarget() {
    # Function
}

或者这样:

function MoveToTarget {
    # function
}

但不是两者都要。

此外,我发现您后来使用逗号来分隔参数 (MoveToTarget $SourcePath, $DestPath)。那也是一个问题。Bash使用空格来分隔参数,而不是逗号。移除逗号,你就应该没问题了。


谢谢!现在我明白了。我看到一些网站也这样做。 - rsmith
@rsmith 告诉我这个网站的名字或者这只是一个梦 :-) - Jens
"function"关键字不符合POSIX标准,请参见bash手册中的“Shell函数定义”。 - qneill
请注意,空函数体是不允许的,这是最令人困惑的部分(因为有些人可能会将测试范围缩小到测试空函数体,但仍然无法正常工作),请参见 https://dev59.com/DVkS5IYBdhLWcg3w6qMz。 - 林果皞
同时 sh 可能会链接到 /bin/dash,你需要将其作为 bash 运行。 - 林果皞
1
这是否取决于Bash的版本?在我的系统上,Bash 4.1.2对function MoveToTarget() { ...非常适用。 - ruakh

5
我也不太懂如何在Bash脚本中定义函数。我使用Bash版本4.3.11(1):-release (x86_64-pc-linux-gnu),运行在 Ubuntu 14.04 (Trusty Tahr)上。
我不知道为什么,但是以关键字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!

它按预期工作。


2
我遇到了完全相同的问题。删除单词“function”并添加括号对也对我有用。我注意到在OS X上,任何一种函数样式都可以正常工作。尽管我的OS X运行的是一个更旧版本的bash。 - Ifrit

3
如果你遇到了“语法错误:‘(’意外”,那么请使用“bash”而不是“sh”。
例如:
bash install.sh 

如果您的脚本是由其他东西调用的,例如 Git hooks 预提交脚本,那么这将没有帮助。 - Peter Mortensen
替代方案:从 which bash 获取信息,然后使用 #!/usr/bin/bash 代替 #!/bin/sh - Peter Mortensen
“#!/bin/bash” 也可以工作(因为“/bin”可能只指向“/bin/usr”)。 - Peter Mortensen
/bin/sh 可能指向 Dash (dash) - 在 Ubuntu MATE 20.04 (Focal Fossa) 上观察到。 - Peter Mortensen

0

我曾遇到相同的问题。有时我在Ubuntu上使用sh和Dash运行脚本。似乎使用sh运行脚本会导致问题,但是使用Dash运行脚本就可以正常工作。


为什么不同?/bin/sh 不是指向 dash(符号链接)吗? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接