Fonctions bash d'Ubuntu ... erreur de syntaxe: "(" ou "}" inattendu

9

Essayer d'exécuter certaines fonctions bash, mais continue de rencontrer des erreurs de syntaxe: "(" inattendu. J'ai essayé de supprimer les crochets, les parenthèses, etc etc ... rien ne semble fonctionner.

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

#!/bin/bash
function hello () {
echo "Hello world"
}
James A
la source
Comment exécutez-vous le script?
muru
Avec des autorisations complètes. sh hello.sh
James A
1
voir ryanstutorials.net/bash-scripting-tutorial/bash-functaions.php
Rinzwind
J'ai lu ses tutoriels hier soir et les ai suivis pour voir où je me trompais ... mais je reçois toujours une erreur de syntaxe qui est très déroutante. Le shebang ne devrait-il pas au moins rendre la fonction compatible même si Ubuntu exécute un shell différent?
James A
Problème résolu. J'utilisais $ sh hello.sh ---> J'obtiens une erreur. Je devrais utiliser ./hello.sh pour l'exécuter correctement. Je suppose que le shebang est écrasé et que le shell de tiret par défaut est utilisé?
James A

Réponses:

18

Si vous exécutez le script avec sh hello.sh, le shell d'interprétation ne sera pas celui mentionné dans la ligne shebang, mais /bin/shsera utilisé. Dans le cas de Debian et Ubuntu par défaut, ce sera le cas dash.

Donc, pour exécuter votre script correctement avec un bash, utilisez l'une des méthodes suivantes.

/bin/bash hello.sh

ou

chmod +x hello.sh
./hello.sh

Alternativement, vous pouvez également définir bashcomme /bin/sh.

dpkg-reconfigure dash 
Thomas
la source
Merci de votre réponse, aucune idée de la raison pour laquelle il a été rejeté: /
James A
2

Première:

L'erreur de syntaxe est due à (). Supprimer () du fichier comme ceci:

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

ou vous pouvez simplement exécuter la commande suivante pour modifier le fichier pour vous:

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

Vous devriez maintenant pouvoir exécuter le fichier avec le résultat souhaité.


Alternativement :

Vous pouvez ajouter les lignes 2, 3 et 4 à votre ~/.bashrcfichier.

function hello () {
echo "Hello world"
}

N'oubliez pas, ne l' utilisez passudo pour éditer votre ~/.bashrcfichier!

Après avoir ajouté les lignes au fichier, exécutez la commande suivante pour redémarrer bash ou "source" votre fichier .bashrc:

. ~/.bashrc

Vous devriez maintenant pouvoir exécuter la commande helloet "Hello world" devrait imprimer dans le terminal.


Aussi:

Vous pouvez modifier le fichier pour dire ceci à la place:

#!/bin/bash
echo "Hello world"

et nommez le fichier helloet enregistrez-le dans /usr/local/bin.

Après avoir fait tout cela, rendez le fichier exécutable en exécutant la commande suivante:

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

Vous devriez maintenant pouvoir exécuter la commande helloet "Hello world" devrait imprimer dans le terminal.


Finalement:

Une troisième option serait d'ajouter la ligne suivante à votre ~/.bashrcfichier:

alias hello='echo "Hello world"'

Ensuite, sourcez votre fichier .bashrc à l'aide de la commande suivante:

. ~/.bashrc 
mchid
la source
Merci pour vos réponses .... J'en ai essayé quelques-unes et j'ai trouvé la réponse assez simple. Au lieu d'utiliser $ sh hello.sh ... ./hello.sh fonctionne très bien. Ce doit être le shebang qui a été écrasé ^^
James A
Pourquoi la réponse de Thomas a-t-elle été rejetée, mais? N'était-il pas correct?
James A
2

GNU Bash est le shell utilisé par défaut dans les terminaux sur Ubuntu. Cependant, lorsque les scripts sont exécutés au démarrage du système, le tiret est utilisé, car c'est le tiret qui est / bin / sh.

Ne fonctionnera pas ->

$ sh hello.sh

Fonctionnera ->

$./hello.sh

Problème résolu

James A
la source
1

Selon votre script:

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

#call this function as follow:
hello   # Syntax Correct
hello() # Syntax Error
Benny
la source