我在 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 0a
aka结尾CR LF
。将其更改为0a
或LF
仅。
答案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上运行)
你的问题将会得到解决。