bash语法错误:"("意外

rsm*_*ith 12 linux macos bash scripting syntax-error

由于某种原因,此功能正常工作,终端正在输出

newbootstrap.sh: 2: Syntax error: "(" unexpected
Run Code Online (Sandbox Code Playgroud)

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

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

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

function RunApplication() {
    #This takes 1 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
Run Code Online (Sandbox Code Playgroud)

Raf*_*ler 27

您使用错误的语法来声明函数.请改用:

MoveToTarget() {
    # Function
}
Run Code Online (Sandbox Code Playgroud)

或这个:

function MoveToTarget {
    # function
}
Run Code Online (Sandbox Code Playgroud)

但不是两个.

此外,我看到稍后您使用逗号分隔arguments(MoveToTarget $SourcePath, $DestPath).这也是一个问题.bash使用空格来分隔参数,而不是逗号.删除逗号,你应该是金色的.


yao*_*bin 5

我对在 Bash 脚本中定义函数也很陌生。我正在Ubuntu\xc2\xa014.04 (Trusty Tahr) 上使用版本 4.3.11(1):-release (x86_64-pc-linux-gnu) 的 Bash。

\n

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

\n

像下面这样的定义

\n
function check_and_start {\n  echo Hello\n}\n
Run Code Online (Sandbox Code Playgroud)\n

产生错误消息:

\n
\n

语法错误:“}”意外

\n
\n

如果我把它放在{一个新行上,例如:

\n
function my_function\n{\n    echo Hello.\n}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

我不知道为什么这不起作用,因为我也看了很多教程,它们都将左大括号放在第一行的末尾。也许这是我们使用的 Bash 版本?无论如何,只是将其放在这里供您参考。

\n

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

\n
check_and_start() {\n  echo $1\n}\n\ncheck_and_start World!\ncheck_and_start Hello,\\ World!\n
Run Code Online (Sandbox Code Playgroud)\n

它按预期工作。

\n

  • 我有同样的问题。删除 function 一词并添加 paran 对我也有用。我注意到这两种函数风格在 OS X 上都可以正常工作。尽管我的 OS X 运行的是更旧版本的 bash。 (2认同)