Ubuntu Bash-Funktionen ... Syntaxfehler: "(" oder "}" unerwartet


9

Beim Versuch, einige Bash-Funktionen auszuführen, tritt jedoch immer wieder ein Syntaxfehler auf: "(" unerwartet. Ich habe versucht, die Klammern, Klammern usw. usw. zu entfernen. Nichts scheint zu funktionieren.

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

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

Wie führt man das Skript aus?
Muru

Mit vollen Berechtigungen. sh hello.sh
James A

1
siehe ryanstutorials.net/bash-scripting-tutorial/bash-functaions.php
Rinzwind

Ich habe letzte Nacht seine Tutorials gelesen und bin ihnen gefolgt, um zu sehen, wo ich falsch gelaufen bin ... aber ich bekomme immer noch einen Syntaxfehler, der sehr verwirrend ist. Sollte der Shebang die Funktion nicht zumindest kompatibel machen, selbst wenn Ubuntu eine andere Shell ausführt?
James A

Problem gelöst. Ich habe $ sh hello.sh verwendet ---> Ich erhalte eine Fehlermeldung. Ich hätte ./hello.sh verwenden sollen, um es korrekt auszuführen. Ich vermute, der Shebang wird überschrieben und die Standard-Dash-Shell verwendet?
James A

Antworten:


18

Wenn Sie das Skript mit sh hello.shausführen, /bin/shwird die Interpretationsshell nicht die in der Shebang-Zeile erwähnte sein, sondern verwendet. Bei Debian und Ubuntu ist dies standardmäßig der Fall dash.

bashVerwenden Sie eine der folgenden Methoden, um Ihr Skript mit a korrekt auszuführen .

/bin/bash hello.sh

oder

chmod +x hello.sh
./hello.sh

Alternativ können Sie auch bashals festlegen /bin/sh.

dpkg-reconfigure dash 

Vielen Dank für die Antwort. Keine Ahnung, warum es abgelehnt wurde: /
James A

2

Zuerst:

Der Syntaxfehler liegt an (). Entfernen Sie () wie folgt aus der Datei:

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

oder Sie können einfach den folgenden Befehl ausführen, um die Datei für Sie zu bearbeiten:

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

Sie sollten nun in der Lage sein, die Datei mit dem gewünschten Ergebnis auszuführen.


Alternativ :

Sie können Ihrer ~/.bashrcDatei die Zeilen 2, 3 und 4 hinzufügen .

function hello () {
echo "Hello world"
}

Denken Sie daran, nicht verwenden sudoIhre bearbeiten ~/.bashrcDatei!

Nachdem Sie die Zeilen zur Datei hinzugefügt haben, führen Sie den folgenden Befehl aus, um bash neu zu starten oder Ihre .bashrc-Datei zu "quellen":

. ~/.bashrc

Sie sollten nun in der Lage sein, den Befehl auszuführen, hellound "Hallo Welt" sollte im Terminal gedruckt werden.


Ebenfalls:

Sie können die Datei bearbeiten, um stattdessen Folgendes zu sagen:

#!/bin/bash
echo "Hello world"

und benennen Sie die Datei hellound speichern Sie die Datei in /usr/local/bin.

Nachdem Sie dies alles getan haben, machen Sie die Datei ausführbar, indem Sie den folgenden Befehl ausführen:

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

Sie sollten nun in der Lage sein, den Befehl auszuführen, hellound "Hallo Welt" sollte im Terminal gedruckt werden.


Schließlich:

Eine dritte Möglichkeit wäre, Ihrer ~/.bashrcDatei die folgende Zeile hinzuzufügen :

alias hello='echo "Hello world"'

Geben Sie dann Ihre .bashrc-Datei mit dem folgenden Befehl ein:

. ~/.bashrc 

Vielen Dank für Ihre Antworten ... Ich habe einige ausprobiert und die Antwort einfach genug gefunden. Anstatt $ sh hello.sh zu verwenden ... ./hello.sh funktioniert gut. Es muss der Schebang sein, der überschrieben wurde ^^
James A

Warum wurde Thomas 'Antwort aber abgelehnt? War er nicht richtig?
James A

2

GNU Bash ist die Shell, die standardmäßig in Terminals unter Ubuntu verwendet wird. Wenn jedoch Skripte beim Systemstart ausgeführt werden, wird der Bindestrich verwendet, da es sich bei dem Bindestrich um / bin / sh handelt.

Funktioniert nicht ->

$ sh hello.sh

Wird funktionieren ->

$./hello.sh

Problem gelöst


1

Nach Ihrem Skript:

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

#call this function as follow:
hello   # Syntax Correct
hello() # Syntax Error
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.