bash文件返回意外标记`$'do\r''

kfi*_*rba 12 bash

我在网上发现了这个脚本并尝试使用它:

#!/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";
Run Code Online (Sandbox Code Playgroud)

我已经在线验证了脚本,脚本没问题.我也试图以各种方式改变它,但它对我不起作用.

我也尝试过运行类似的东西:

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

我仍然得到同样的错误:

./git-copy.sh: line 6: syntax error near unexpected token `$'do\r''
'/git-copy.sh: line 6: `do
Run Code Online (Sandbox Code Playgroud)

这是为什么?

Ell*_*sch 27

您的脚本已在基于DOS或Windows的系统上编辑,并包含Linux/Unix不喜欢的回车符(即什么\r).您可以使用dos2unix将回车行结尾转换为正确的格式; 如果你没有,dos2unix你可能会awk喜欢

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


Bfc*_*fcm 24

另一种使用unix文本编辑器vi的可能解决方案:

使用vi filename.sh命令在vi中打开文件;

输入vi :set ff=unix命令;

保存文件 :wq

它将使用unix行结尾保存文件.

  • 有史以来最好、最快的解决方案 (2认同)

JRi*_*dsz 5

这为我工作:

dos2unix my_script.sh
Run Code Online (Sandbox Code Playgroud)

如果您没有dos2unix:

对于CentOS,Fedora或RHEL:

$ sudo yum install dos2unix
Run Code Online (Sandbox Code Playgroud)

对于Ubuntu或Debian:

$ sudo apt-get install tofrodos
$ sudo ln -s /usr/bin/fromdos /usr/bin/dos2unix 
Run Code Online (Sandbox Code Playgroud)

说明

这通常是在可执行文件在操作系统(windows)中创建并在另一个操作系统(Linux)中使用时引起的。另外,罕见的文本编辑器也可能是问题所在。


Coo*_*kie 5

只需将文本编辑器中的行序列从 CRLF 更改为 LF。它对我有用:)

对于记事本++edit => EOL Conversion => Unix(LF)