私は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を使用しているからだと思います。
指摘 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
使用しているファイルの最後にWindowsスタイルのラインフィード(CR)があります(Windows XPでCygwinを使用しているときに同じことが起こりました)。
'dos2unix.exe'を使用して修正すると、問題がないはずです。
$ dos2unix.exe script.sh
dos2unix: converting file script.sh to Unix format...
次に、スクリプトを再実行すると、これらのエラーメッセージは表示されなくなります。
これは、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
のみに変更してください。
問題は、使用できる非UNIX形式のスクリプトファイルがあるためです。
vi new_name_for_your_script
コピーアンドペーストを実行します(Windows上で実行しています)
あなたの問題は解決されます。