Ubuntu bash functions..syntax error: «(» или «}» неожиданно

9

Пытался запустить некоторые функции bash, но постоянно сталкивался с синтаксической ошибкой: "(" неожиданно. Я пытался снять скобки, скобки и т. Д. И т. Д. ..., похоже, ничего не работает.

$ bash --version
GNU bash, version 4.3.46(1) release

#!/bin/bash
function hello () {
echo "Hello world"
}
Джеймс А
источник
Как у вас работает скрипт?
Муру
С полными разрешениями. sh hello.sh
Джеймс A
1
см. ryanstutorials.net/bash-scripting-tutorial/bash-functaions.php
Rinzwind
Вчера вечером я прочитал его уроки и проследил за ними, чтобы понять, в чем я ошибался ... но все равно получаю синтаксическую ошибку, которая очень запутывает Разве шебанг должен хотя бы сделать функцию совместимой, даже если в Ubuntu запущена другая оболочка?
Джеймс
Задача решена. Я использовал $ sh hello.sh ---> Я получаю ошибку. Я должен был использовать ./hello.sh, чтобы запустить его правильно. Я предполагаю, что shebang перезаписывается и используется оболочка тире по умолчанию?
Джеймс

Ответы:

18

Если вы запускаете скрипт с помощью sh hello.sh, интерпретирующая оболочка не будет той, что указана в строке shebang, но /bin/shбудет использоваться. В случае Debian и Ubuntu по умолчанию это будет dash.

Таким образом, чтобы правильно запустить скрипт с помощью a bash, используйте одно из следующих.

/bin/bash hello.sh

или

chmod +x hello.sh
./hello.sh

В качестве альтернативы вы также можете установить bashкак /bin/sh.

dpkg-reconfigure dash 
Томас
источник
Спасибо за ответ. Не знаю, почему за него проголосовали: /
Джеймс
2

Первый:

Синтаксическая ошибка из-за (). Удалить () из файла следующим образом:

#!/bin/bash
function hello {
echo "Hello world"
}

или вы можете просто запустить следующую команду, чтобы отредактировать файл для вас:

sed -i 's/() //g' hello.sh

Теперь вы сможете запустить файл с желаемым результатом.


Альтернативно :

Вы можете добавить строки 2, 3 и 4 в ваш ~/.bashrcфайл.

function hello () {
echo "Hello world"
}

Помните, не используйте sudoдля редактирования вашего ~/.bashrcфайла!

После добавления строк в файл выполните следующую команду, чтобы перезапустить bash или «исходный» файл .bashrc:

. ~/.bashrc

Теперь вы должны быть в состоянии запустить команду, helloи «Hello world» должен напечатать в терминале.


Также:

Вы можете отредактировать файл, чтобы сказать это вместо этого:

#!/bin/bash
echo "Hello world"

и назовите файл helloи сохраните файл в /usr/local/bin.

Сделав все это, сделайте файл исполняемым, выполнив следующую команду:

sudo chmod +x /usr/local/bin/hello

Теперь вы должны быть в состоянии запустить команду, helloи «Hello world» должен напечатать в терминале.


В заключение:

Третий вариант - добавить следующую строку в ваш ~/.bashrcфайл:

alias hello='echo "Hello world"'

Затем создайте файл .bashrc с помощью следующей команды:

. ~/.bashrc 
mchid
источник
Спасибо за ваши ответы .... Я попробовал несколько и нашел ответ достаточно простым. Вместо использования $ sh hello.sh ... ./hello.sh работает нормально. Должно быть, шебанг был переписан ^^
Джеймс
Почему голос Томаса был отклонен, но? Был ли он не прав?
Джеймс
2

GNU Bash - это оболочка, используемая по умолчанию в терминалах Ubuntu. Однако, когда сценарии выполняются при загрузке системы, используется тире, так как это тире / bin / sh.

Не сработает ->

$ sh hello.sh

Будет работать ->

$./hello.sh

Задача решена

Джеймс А
источник
1

Согласно вашему сценарию:

#!/bin/bash
function hello () {
    echo "Hello world"
}

#call this function as follow:
hello   # Syntax Correct
hello() # Syntax Error
Бенни
источник