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

作为指出经过奥特——,您的脚本有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 -i 's/\r$//' script

答案2

这是你的 hexdump 脚本

00000000  23 21 2f 62 69 6e 2f 62  61 73 68 0d 0a 77 68 69  |#!/bin/bash..whi|
00000010  6c 65 20 72 65 61 64 20  6e 61 6d 65 3b 20 64 6f  |le read name; do|
00000020  0d 0a 65 63 68 6f 20 22  4e 61 6d 65 20 72 65 61  |..echo "Name rea|

这些行以0d 0aaka结尾CR LF。将其更改为0aLF仅。

答案3

您正在使用的文件末尾有 Windows 风格的换行符 (CR)(我在 Windows XP 上使用 Cygwin 时也发生了同样的事情)。

使用“dos2unix.exe”进行纠正,应该没问题:

$ dos2unix.exe script.sh

dos2unix: converting file script.sh to Unix format...

然后重新运行脚本,这些错误消息应该不再出现。

答案4

问题是因为您的脚本文件是非 UNIX 格式,您可以使用:

vi new_name_for_your_script

并进行复制粘贴(您正在Windows上运行)

你的问题将会得到解决。

相关内容