Pertanyaan file bash mengembalikan token yang tidak diharapkan `$ 'do \ r' '


Saya menemukan skrip ini secara online dan mencoba menggunakannya:

#!/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";

Saya telah memvalidasi naskah secara online, dan skripnya tidak masalah. Saya juga mencoba mengubahnya dengan berbagai cara, tetapi itu tidak berhasil untuk saya.

Saya juga mencoba menjalankan sesuatu seperti:

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

Dan saya masih mendapatkan kesalahan yang sama:

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

Mengapa demikian?


8
2017-11-27 18:14


asal


Jawaban:


Skrip Anda telah diedit pada sistem berbasis DOS atau Windows dan berisi karakter carriage-return yang tidak disukai Linux / Unix (apa \r aku s). Anda bisa menggunakannya dos2unix untuk mengonversi akhir baris carriage return ke format yang benar; jika kamu tidak punya dos2unix Anda mungkin menggunakan awk seperti

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

20
2017-11-27 18:19



Solusi lain yang mungkin menggunakan editor teks unix vi:

buka file di vi edit dengan vi filename.sh perintah;

ketik vi :set ff=unix perintah;

simpan file dengan :wq

Ini akan menyimpan file dengan akhiran baris unix.


17
2017-11-17 09:50



Ini adalah mimpi buruk yang agak umum :)

Saya membangun skrip untuk menormalkan \r\n dari Dos dan dari Mac (lama); itu juga menghilangkan BOM jika ada:

#!/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

Pemakaian: script textualfile*

Ok, ok: Pilih nama yang lebih baik untuk itu! chmod dan instal


2
2017-11-27 19:08



Ini berhasil untuk saya:

dos2unix my_script.sh

Jika Anda tidak memiliki dos2unix:

Untuk menginstal dos2unix di CentOS, Fedora atau RHEL:

$ sudo yum install dos2unix

Untuk menginstal dos2unix di Ubuntu atau Debian:

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

HTH


2
2018-03-24 16:34