我在 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