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 LF0aor onlyに変更してください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で実行中)

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

関連情報