Bash Синтаксическая ошибка: "(" неожиданный

По какой-то причине эта функция работает правильно, терминал выводит

newbootstrap.sh: 2: Syntax error: "(" unexpected

Вот мой код (строка 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

Ответ 1

Вы используете неправильный синтаксис для объявления функций. Используйте это вместо:

MoveToTarget() {
    # Function
}

Или это:

function MoveToTarget {
    # function
}

Но не оба.

Кроме того, я вижу, что позже вы используете запятые для разделения аргументов (MoveToTarget $SourcePath, $DestPath). Это тоже проблема. bash использует пробелы для разделения аргументов, а не запятых. Удалите запятую, и вы должны быть золотыми.

Ответ 2

Я также новичок в определении функций в сценариях bash. Я использую bash версии версии 4.3.11 (1): - release (x86_64-pc-linux-gnu) на Ubuntu 14.04.

Я не знаю, почему, но определение, начинающееся с ключевого слова function, никогда не работает для меня.

Определение, подобное следующему

function check_and_start {
  echo Hello
}

выводит сообщение об ошибке:

Syntax error: "}" unexpected

Если я поместил { в новую строку, например:

function my_function
{
    echo Hello.
}

Он печатает a Hello., когда я запускаю script, даже если я вообще не вызываю эту функцию, и это то, что мы хотим.

Я не знаю, почему это не сработало, потому что я также смотрел много учебников, и все они положили открытую фигурную скобку в конце первой строки. Может быть, это версия bash, которую мы используем? Во всяком случае, просто поставьте здесь свою информацию.

Мне нужно использовать определение функции C-стиля:

check_and_start() {
  echo $1
}

check_and_start World!
check_and_start Hello,\ World!

и работает как ожидалось.

Ответ 3

Я была такая же проблема. Я запускал сценарии в Ubuntu, иногда используя sh vs dash. Кажется, запуск сценариев с sh вызывает проблему, но запуск сценариев с тире работает нормально.