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 0a
akaで終わりますCR LF
。0a
or 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で実行中)
あなたの問題は解決されます。