「ライン 1: $':\r': コマンドが見つかりません」というメッセージが表示されるのはなぜですか。

「ライン 1: $':\r': コマンドが見つかりません」というメッセージが表示されるのはなぜですか。

私のラップトップ(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

今行ってもいいです。


vimCygwinで使用されているCygwinでは、viこれを行うにはいくつかの方法があります。もう1つはfileformat値を取ることができる設定に関連していますdosunixファイルをロードした後に明示的に変更

ファイル形式の設定= 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 行末を使用するには反転します。

関連情報