Ubuntu bash Функції .. помилка синтаксису: "(" або "}" несподівано)


9

Намагаюся запустити деякі функції bash, але не стикайтеся з синтаксичною помилкою: "(" несподівано. Я намагався зняти дужки, дужки тощо тощо), здається, нічого не працює.

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

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

Як ви запускаєте сценарій?
муру

З повним дозволом. sh hello.sh
Джеймс А

1
дивись ryanstutorials.net/bash-scripting-tutorial/bash-functaions.php
Rinzwind

Я читав його підручники вчора ввечері і слідкував за ними, щоб побачити, де я пішов не так ... але я все одно отримую синтаксичну помилку, яка дуже заплутана. Чи не повинен shebang принаймні зробити цю функцію сумісною, навіть якщо Ubuntu працює з іншою оболонкою?
Джеймс А

Проблема вирішена. Я використовував $ sh hello.sh ---> я отримую помилку. Я повинен використовувати ./hello.sh, щоб правильно запустити його. Я здогадуюсь, що шебанг перевершує написане і використовується штрих тире за замовчуванням?
Джеймс А

Відповіді:


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 

Дякую за відгук. Не знаю, чому за це було проголосовано: /
James A

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 

Дякую за ваші відповіді .... Я спробував декілька і знайшов відповідь досить простою. Замість використання $ sh hello.sh ... ./hello.sh працює чудово. Це, мабуть, шебанг був написаний ^^
James A

Чому голос Томаса був проголосований, але? Хіба він не був прав?
Джеймс А

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.