web-dev-qa-db-fra.com

le fichier bash renvoie un jeton inattendu `$ 'do\r' '

J'ai trouvé ce script en ligne et j'ai essayé de l'utiliser:

#!/bin/sh
# Target directory
TARGET=$3
echo "Copying to $TARGET"
for i in $(git diff --name-only $1 $2)
    do
        # First create the target directory, if it doesn't exist.
        mkdir -p "$TARGET/$(dirname $i)"
        # Then copy over the file.
        cp "$i" "$TARGET/$i"
    done
echo "Done";

J'ai validé le script en ligne, et le script est bon. J'ai également essayé de le changer de différentes manières, mais cela ne fonctionne pas pour moi.

J'ai aussi essayé de lancer quelque chose comme:

#!/bin/sh
# Target directory
TARGET=$3
echo "Copying to $TARGET"
for i in $(ls)
do
    echo "text"
done

Et j'obtiens toujours la même erreur:

./git-copy.sh: line 6: syntax error near unexpected token `$'do\r''
'/git-copy.sh: line 6: `do

Pourquoi donc?

9
kfirba

Votre script a été modifié sur un système DOS ou Windows et contient des caractères de retour à la ligne que Linux/Unix n'aime pas (c'est ce que \r est). Vous pouvez utiliser dos2unix pour convertir les fins de ligne de retour chariot au format correct; Si vous n'avez pas dos2unix, vous pouvez utiliser awk comme

awk '{ sub("\r$", ""); print }' git-copy.sh > git-copy2.sh
mv git-copy2.sh git-copy.sh
21
Elliott Frisch

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

ouvrir le fichier dans vi edit avec la commande vi filename.sh;

tapez vi :set ff=unix commande;

enregistrer le fichier avec :wq

Il enregistre le fichier avec les fins de ligne Unix.

21
Bfcm

Cela a fonctionné pour moi:

dos2unix my_script.sh

Si vous n'avez pas dos2unix:

Pour installer dos2unix sur CentOS, Fedora ou RHEL:

$ Sudo yum install dos2unix

Pour installer dos2unix sur Ubuntu ou Debian:

$ Sudo apt-get install tofrodos
$ Sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix 

HTH

3
JRichardsz

C'est un cauchemar plutôt commun :)

J'ai construit un script pour normaliser \r\n à partir de Dos et de (ancien) Mac; il supprime également la nomenclature si elle est présente:

#!/usr/bin/Perl -pi
s/\012\r|\r\012|\012|\r/\012/g;            ## normalize line endings
s/^(\xFF\xFE|\xFE\xFF|\xEF\xBB\xBF)//;     ## remove common initial BOM

Utilisation: script textualfile*

Ok, ok: Choisissez un meilleur nom pour cela! chmod et l'installer

2
JJoao

J'ai eu un cas dans lequel il fallait écrire (INSERT) dans la base de données DB le champ qui contenait un tel script bash (sur la version Windows d'Intellij Idea), puis de lire le script depuis la base de données sur le serveur Unix. Sur unix, j'ai eu l'erreur $'do\r'' de ce sujet pour la raison expliquée ci-dessus.

La solution était - copier/coller le script sous Win dans le Bloc-notes, changer les fins de ligne du Bloc-notes unix de Windows (CR LF) en Unix (LF), enregistrez-le dans un fichier. Ouvrir le fichier, copier/coller dans la console de la base de données Idea. Ensuite, cela a bien fonctionné sous Unix car ce n’était pas Origin from Unix.

(Idea a également des options pour choisir les fins de ligne dans son éditeur)

0
d0wn

Modifiez simplement votre séquence de lignes dans votre éditeur de texte de CRLF à LF. Cela a fonctionné pour moi :)

0
Cookie