Erreur de script shell à l'aide de Cygwin

0

J'ai eu cette erreur après l'exécution du script shell comme ci-dessous.

$ ./script_test.sh
./script_test.sh: line 3: syntax error near unexpected token `$'do\r''
'/script_test.sh: line 3: `for ((j=0; j<"$N"; j++)) ; do

Script ci-dessous

#!/bin/sh

# This script will launch 10 simulations for each value of the PARAM1_LIST.
# Simulations results will be stored in folders named "myTest-i-j", where i
# is the effective value of the PARAM1_LIST for each simulation and j
# is the 1 to 10 repetition for each i.

N=10
PARAM1_LIST=(1 2 5 10)

for (( j = 0 ; j < $N; j++ )); do
for i in ${PARAM1_LIST[@]}; do
java -jar N3Sim.jar myConfigFile.cfg myTest-${i}-${j} $i
done
done
leepyron
la source
Difficile à dire en raison de la mise en forme ci-dessus, mais il semblerait que vous ayez besoin de vous #!/bin/shau lieu de !/bin/sh?
Kent
Le PO semble avoir écrit un shebang complet, mais le balisage a mangé le hash.
Hennes
Quelle erreur exactement?
Journeyman Geek
Vous pouvez ajouter un en- set -xdessous de la ligne shebang pour obtenir plus d'informations de débogage.
Hennes
En outre, je remarque et erreur près $'do\r. C'est \rune nouvelle ligne . Peut-être cette ligne a-t-elle été écrite ou copiée depuis un endroit avec des fins de ligne autres que celles attendues par votre interprète.
Hennes

Réponses:

0

Votre script contient des retours CR LFà la ligne DOS au lieu de ceux Unix LF. $'\r'est une séquence d'échappement bash pour le CRcaractère de contrôle qui ne devrait normalement pas être contenu dans les fichiers texte Unix. C'était à la fin de la ligne 3, qui est maintenant la ligne 11, car vous avez probablement ajouté la séquence shebang et les commentaires plus tard.

La solution consiste à convertir les nouvelles lignes:

dos2unix script_test.sh

Notez également que le script utilise la construction bash du tableau et que le shebang devrait l'être #!/bin/bash.

Pabouk
la source
Merci d'avoir répondu. J'ai juste besoin de convertir le script au format Unix en utilisant cygwin. Tout ce que je mets dans hash-tag n'est qu'une simple explication de ce que j'essaie de faire.
leepyron
@leepyron je ne comprends pas tout à fait votre commentaire. Vous pouvez convertir votre fichier de script à l'aide de l' dos2unixutilitaire (comme indiqué dans la réponse), qui fait partie de Cygwin . Si, pour une raison quelconque, vous ne pouvez pas installer le dos2unixpackage, vous pouvez utiliser par exemple sed 's/\r//' script_test.sh >script_test-converted.shou tr -d '\r' <script_test.sh >script_test-converted.sh. Voir Alternatives à la conversion unix2dos .
Pabouk
@leepyron suite: Par "hash-tag", vous voulez dire la séquence de shebang#!/bin/bash ? C'est un chemin d'accès à l'interpréteur de script qui lira et interprétera votre fichier de script lorsque vous l'exécuterez. Par exemple, le script Korn Shell commencerait par #!/bin/ksh.
Pabouk
@leepyron Comme Glenn et moi-même l'avons écrit plus tôt: Dans votre cas, changez #!/bin/shle fichier en commençant par #!/bin/bashcar votre script est un script Bash.
Pabouk
Bonjour @pabouk, je ne sais pas de quoi vous parlez. Je suis encore nouveau avec tout ce truc. Mon but est uniquement de créer un script pour automatiser des simulations pour une liste de valeurs d’un paramètre et répéter chaque simulation N fois. J'utilise un logiciel open source avec le fichier .cfg. En ce moment, le script fonctionne parfaitement après que je l’ai converti en utilisant la commande dos2unix dans cygwin. Merci de votre attention. C’est le guide que je suis: n3cat.upc.edu/tools/UserGuide/UserGuide.html
leepyron
0

Vous utilisez les fonctionnalités bash mais utilisez un interpréteur sh. Changer la ligne shebang à#!/bin/bash

Pour décomposer:

$ /bin/sh
$ i=1
$ ((i++))
/bin/sh: i++: not found
Glenn Jackman
la source
0

Une autre solution possible en utilisant l'éditeur de texte unix vi:

ouvrir le fichier dans vi edit avec la vi filename.shcommande;

tapez la :set ff=unixcommande vi ;

enregistrer le fichier avec :wq

Il enregistre le fichier avec les fins de ligne Unix.

Bfcm
la source