
私のラップトップ(DOS)でCygwinを使用しています。私は同僚と私自身からシナリオを集めました。私はITの専門家ではなく、Unixを理解していません。私は同僚の文法に従い、いくつかの簡単なことを処理できます。
このスクリプトは私の古いラップトップでうまく動作します。先ほどノートパソコンを変更してCygwinをインストールしました。スクリプトを実行しても機能しません。以下は、私が受け取ったエラーメッセージの例です。
line 1: $':\r': command not found
line 5: syntax error near unexpected token `$'\r''
line 5: `fi
私のスクリプトの最初の5行は次のとおりです。
:
iter=1
if [ -f iter.txt ]
then rm ./iter.txt
fi
誰かがこの問題を解決する方法を説明できますか?
答え1
Windowsスタイルの行末があります。
対照的に、ランダムなコマンドは:
で読み取られ、:<carriage return>
でマークされる、またはより:\r
完全にマークされます$':\r'
。
ただ走ればdos2unix scriptname
大丈夫でしょう。
その項目がない場合は、dos2unix
次のことが機能します。ほぼどこでも(WindowsのMobaXtermでテストしました):
vi -b filename
次に、vi
次のように入力します。
:%s/\r$//
:x
今行ってもいいです。
vim
Cygwinで使用されているCygwinでは、vi
これを行うにはいくつかの方法があります。もう1つはfileformat
値を取ることができる設定に関連していますdos
。unix
ファイルをロードした後に明示的に変更
ファイル形式の設定= Unixまたは、ファイルを書き込むときに明示的にファイル形式を強制します。
:w +ファイル形式= Unix
詳細については、次のようなトピックをカバーする多くの質問と回答をご覧ください。
答え2
これは、DOS行の終わりを使用するエディタ(Notepad ++など)によってスクリプトが保存されたためです。スクリプトからそれらを削除する必要があります。
これを行うには、dos2unix
スクリプトファイルを使用するか、
$ tr -d '\r' <script >script.new && mv script.new script
(これにより、すべてのキャリッジリターンが削除されます。どこかにスクリプトから)
スクリプトのコードは次のとおりです。
:
iter=1
if [ -f iter.txt ]
then rm ./iter.txt
fi
これは次のように見えるかもしれません
iter=1
if [ -f "./$iter.txt" ]; then
rm "./$iter.txt"
fi
1.txt
現在のディレクトリにファイルがある場合は削除されます。この:
コマンドは(ほとんど)何もしません。削除することができます。変数iter
の値はとして使用し、$iter
引用符で囲む必要があります。これにより、./
ファイルを現在のディレクトリに見つける必要があると言うと、必要以上に明確になります。
これをループに切り替えたい場合(ここからすべてのファイル1.txt
、、2.txt
...を削除10.txt
):
iter=1
while [ "$iter" -le 10 ]; then
if [ -f "./$iter.txt" ]; then
rm "./$iter.txt"
fi
iter=$(( iter + 1 ))
done
または、私たちが狡猾な、または怠惰な感じがある場合は、
rm -f {1..10}.txt
中かっこ拡張を理解するシェルから。
答え3
スクリプトに無効な行末があります。 Windows は CR+LF(\r\n)、Unix は LF(\n)、Classic MacOS は CR(\r) を使用します。テキストエディタやスタンドアロンツール(例dos2unix
:。
FTPやバージョン管理システム(SVNなど)は行末を適切に変換する傾向があるため、後でファイル転送のためにこれらのオプションを確認することをお勧めします。
これらのファイルいいえ転送しているが単一のコンピュータでのみ使用したい場合は、お気に入りのテキストエディタで行末の設定を見つける必要があります。 「プログラマー向け」として販売されているほとんどの製品にはこのオプションがあります。
答え4
dos2unixでなければ「flip」もあります
$ 反転 -u ファイル名.txt
UNIX 行末を使用するには反転します。