`Erreur de syntaxe:“ (”inattendu` lors de la création d'un tableau

37

J'ai deux serveurs (Debian) Linux. Je crée un script shell.

Sur le premier je crée un tableau ainsi:

#!/bin/bash
target_array=(
    "/home/user/direct/filename -p123 -r"
)

Cela fonctionne bien. Mais quand je lance ceci sur l'autre serveur, je reçois:

Syntax error: "(" unexpected

Autant que je sache, les deux serveurs sont les mêmes. Quelqu'un peut-il expliquer pourquoi cela ne fonctionne pas?

Si je le tape directement dans le terminal, tout va bien ??


Il semblerait que quand je le lance en tant que

sh scriptname.sh

J'obtiens l'erreur, mais si je l'exécute en tant que

./scriptname.sh

ça semble aller. Quelle est la différence?

IGGt
la source
Avez-vous copié-collé le script entre les deux serveurs? essayez cat -v <script>de voir s'il y a des parasites parasites.
LilloX
2
shn'est pas bashet donc si sh scriptname.shmal que ça marche
Eric Renouf

Réponses:

56

Lorsque vous l'utilisez, ./scriptname.shil s'exécute avec /bin/bashcomme dans la première ligne avec #!. Mais quand vous l'utilisez, sh scriptname.shça s'exécute sh, pas bash.

Le shshell n'a pas de syntaxe pour créer des tableaux, mais Bash a la syntaxe que vous avez utilisée.

Konstantin Morenko
la source
OK, c'est logique maintenant. Comme vous pouvez probablement le constater, je suis assez nouveau sur Linux (j'essaie actuellement de convertir mes scripts Powershell en scripts shell / bash). Je vais m'en tenir à utiliser à partir ./de maintenant. à la
vôtre
Ce n'est pas nécessairement, mais il doit y avoir une coordination entre #!/bin/shet sh script.sh(ou #!/bin/bashet bash script.sh)
Konstantin Morenko
3
La langue sh n'a pas de tableaux ( a[index]=xou a=(x y)). Certains interprètes sh prennent en charge les tableaux, que ksh88 (non portés sous Linux AFAIK) et quelques variantes de pdksh âgées soutiendraient a[index]=valueet non a=(x y). Sur Debian, shc’est généralement dashce qui ne prend pas en charge le tableau ( a[index]=xcela ne fonctionnera pas).
Stéphane Chazelas
1
Je peux mourir en pièces à partir de maintenant! :)
Paulo
0

Courir ./scriptname.shse traduira par la lecture de la première ligne du fichier et veillera à ce qu’il soit nécessaire d’exécuter «/ bin / bash» et de transmettre le reste du script à l’interpréteur. Pendant l’exécution sh scriptname.sh, le fichier sera transmis au shell standard de l’utilisateur (par exemple, Ash). et soyez le cas que cet autre interpréteur ne supporte pas les tableaux comme Bash.

dave_alcarin
la source
1
shn'est pas nécessairement le "shell standard de l'utilisateur" mais bien souvent son propre exécutable (ou lien symbolique) et shsera invoqué pour traiter le script. Cela sera vrai même si le shell de connexion par défaut pour cet utilisateur estbash
Eric Renouf
C’est la partie dans laquelle je n’étais pas tout à fait sûr pour le moment. Merci pour la clarification!
dave_alcarin
0

Avec sh scriptname.sh, vous l'exécutez avec sh, pas nécessairement avec bash. Essayez de comparer sh --versionsur les deux machines. Et / ou avec dpkg -S $(which sh).

joepd
la source
Même si shun lien symbolique vers bashcelui-ci se comportera différemment lorsqu'il sera appelésh
Eric Renouf