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

おすすめ記事