web-dev-qa-db-ja.com

Cygwinでの読み取り行スクリプトの問題

私はCygwinを使用してWindows7を使用しています。

スクリプトとテキストファイルは同じディレクトリにあります。

#!/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を使用しているからだと思います。

3
mkrouse

指摘 by ott- のように、スクリプトには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(キャリッジリターン)と\n(改行)の文字があり、\n文字のみが必要です。これは、Windowsシステムと* nixシステム間の互換性の問題の結果です。 Bashは\r文字を処理するのが困難です。

dos2unixなどのユーティリティを使用するか、次の行を実行して、スクリプトを修正できます。

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

使用しているファイルの最後にWindowsスタイルのラインフィード(CR)があります(Windows XPでCygwinを使用しているときに同じことが起こりました)。

'dos2unix.exe'を使用して修正すると、問題がないはずです。

$ dos2unix.exe script.sh

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

次に、スクリプトを再実行すると、これらのエラーメッセージは表示されなくなります。

1
Azkuma

これは、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別名CR LFで終わります。 0aまたはLFのみに変更してください。

1
ott--

問題は、使用できる非UNIX形式のスクリプトファイルがあるためです。

vi new_name_for_your_script

コピーアンドペーストを実行します(Windows上で実行しています)

あなたの問題は解決されます。

0
Gerrard