Cygwin 语法问题

Cygwin 语法问题

我在 Windows 7 上使用 Cygwin。

我的脚本和文本文件位于同一目录中。

#!/bin/bash
while read name; do
echo "Name read from file - $name"
done < /home/Matt/servers.txt

我收到这个错误,但我不知道为什么,因为这是正确的 while 循环语法..?

u0146121@U0146121-TPD-A ~/Matt
$ ./script.sh
./script.sh: line 4: syntax error near unexpected token `done'
./script.sh: line 4: `done < /home/Matt/servers.txt'

有人能告诉我我做错了什么吗?我认为这是因为我在 Windows 上使用 Cygwin。

答案1

前面的答案是正确的,因为 Windows 会放置 \r\n,但 *nix 系统只接受 \n。然而,在 Windows 机器上有一个非常简单的方法可以解决这个问题。

在文本编辑器(例如 Textpad)中,选择“另存为”,然后在文件名下选择“行尾”。在这里,将其保存为“UNIX”,文件将使用 \r 正确编码,并且您的脚本将正常工作。

答案2

此脚本有 CR LF 行尾。使用 可以更明显地看到od

$ od -c script
0000000   #   !   /   b   i   n   /   b   a   s   h  \r  \n   w   h   i
0000020   l   e       r   e   a   d       n   a   m   e   ;       d   o
0000040  \r  \n   e   c   h   o       "   N   a   m   e       r   e   a
0000060   d       f   r   o   m       f   i   l   e       -       $   n
0000100   a   m   e   "  \r  \n   d   o   n   e       <       /   h   o
0000120   m   e   /   M   a   t   t   /   s   e   r   v   e   r   s   .
0000140   t   x   t  \r  \n
0000145

如您所见,我在每行末尾都出现了\r(回车)和(换行)字符,而这些字符应该只有字符。这是由于 Windows 和 *nix 系统之间的兼容性问题造成的。Bash 很难处理这些字符。\n\n\r

dos2unix您可以使用类似的实用程序或运行以下命令来修复脚本sed

sed -i 's/\r$//' script

相关内容