「1行目:$ ':\ r':コマンドが見つかりません」と表示されるのはなぜですか?


13

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

誰かがこの問題を回避する方法を説明してくれませんか?

回答:


28

Windowsスタイルの行末があります。

:代わりに、no-opコマンドはと読み取られ:<carriage return>、と表示される:\rか、より完全にと表示され$':\r'ます。

走れdos2unix scriptnameば大丈夫だ。


を持っていない場合dos2unix、以下はほとんどどこでも動作するはずです(WindowsではMobaXtermでテストしました)。

vi -b filename

次に、次のようviに入力します。

:%s/\r$//
:x

あなたは行ってもいいです。


ではvim、あなたがCygwinの上で使用しているもので、viこれを行うための複数の方法があります。もう1つはfileformat設定を含み、値dosまたはを取ることができますunix。でファイルをロードした後で明示的に変更するか

set fileformat = unix
またはでファイルを書き出すときにファイル形式を明示的に強制する

:w + fileformat = unix

これについて詳しくは、以下を含む、このテーマに関する多くの質問と回答をご覧ください。


明確にしたいのですが、「iter = 1」はカウンターであり、数学アルゴリズムのラウンドの回数に使用されます。モデルは、行5を超えて後で繰り返す必要があります。エラーメッセージ。すべてのコメントと指示は大歓迎です!!
TPham

提案されたコマンド「$ tr -d .....」を試してみましたが、私のラップトップに何か問題があります。「$」には戻りませんが、代わりに「>」が画面に表示されます。contrl Cを使用して外に出る必要があります。次に、スクリプトをテストして問題が解決したかどうかを確認しましたが、まだ問題は解決していません。申し訳ありませんが、この分野での私の知識は非常にわずかです!スクリプトは私の仕事を非常に助けてくれるので、スクリプトのコレクションを活用しようとしています。忍耐強くて私に助けてくれてありがとう。
TPham

@TPham、編集を参照してください。これが機能する場合は、「受け入れる」という答えの横にあるチェックマークを使用してください。(問題を最もよく解決した答えを受け入れます。) unix.stackexchange.com/help/someone-answers
ワイルドカード

1
単語であるコマンドは、ほぼ完全に句読点である神秘的な呪文よりも、初心者にとってそれほど複雑ではありません。これは別の答えを必要としません。vimこれは2つの方法でこれを行うことができることを言及するためにこの回答が必要です。1つは単語を使用します。または、さらに良いことに、この下位のタスクがここ何度も回答された場所を、このページのどの回答よりはるかに詳細に指摘します。
JdeBP

1
とにかくvi -b\rはvim拡張であることに注意してください。ないPOSIX、ないでNVI、エルビス、SolarisのVI ...
ステファンChazelas

10

これは、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.txt2.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
Notepad ++には、実際にはWindows / Mac / Linuxの改行を使用するオプションがあります。[編集]メニューから[EOL変換]-> [Unix(LF)]に移動するだけです。それとも、ただダブルそれが言う右下隅にクリック可能性Windows (CR LF)とそれを変更するUnix (LF)
jesse_b

皆様、どうもありがとうございました。明確にしたい:「iter = 1」は、5行目以降の主な目的のために後で使用するカウンターです。
TPham17年

@TPhamどういたしまして。私は退屈してあなたのコードを取り、私の心にそれを印象派にさせました。
クサラナンダ

またはrm -f [1-9].txt 10.txt。しかし、これは完全に論理的に同等ではありません。1-9のファイルは存在しない、文字通り呼び出されたファイルがある場合[1-9].txt削除されます。:D
ワイルドカード

5

スクリプトの行末が間違っています。WindowsはCR + LF(\ r \ n)を使用し、UnixはLF(\ n)を使用し、Classic MacOSはCR(\ r)を使用します。テキストエディタまたはのようなスタンドアロンツールを使用して、影響を受けるすべてのファイルの行末を変更する必要がありますdos2unix

FTPおよびSVNのようなバージョン管理システムは、行末を適切に変換できる傾向があるため、将来ファイルを転送するためのオプションを検討する必要がある場合があります。

これらのファイル転送されず、1台のマシンで使用されるだけの場合は、お好みのテキストエディターで行末の設定を確認する必要があります。「プログラマー向け」として宣伝されているほとんどの場合、このようなオプションがあります。


皆様のご指導ありがとうございました。dos2unixを試しましたが、持っていないようです。検索して再試行します。
TPham

3

補足的な回答として、いくつかのメモ/ヒントを追加しましょう...

まず、通常のテキストファイルの場合、fileコマンドを使用して、UnixまたはDOSの行末を持っているかどうかを簡単に判断できます。例えば:

$ file test.txt
test.txt: ASCII text, with CRLF line terminators
$ dos2unix test.txt
dos2unix: converting file test.txt to Unix format...
$ file test.txt
test.txt: ASCII text

私の使用に注意してくださいdos2unix。インストールすることを強くお勧めします。Cygwinの使用方法によっては、この変換を頻繁に実行する必要がある場合があります。さらに重要なことは、ここで説明した手動編集で発生するようなエラーの可能性がないことです。

インストールするには、メインのCygwin実行可能ファイルを起動します。これは、setup-x86_64.exeなどの名前の付いたものです。次のような画面が表示されることを確認してください。

ここに画像の説明を入力してください

すでにプライマリインストールが完了しているので、選択画面が表示されるまで[ へ]をクリックすることができます。ドロップダウンで[完全]を選択し、検索ボックスに「dos2」と入力して、次のようにツールを選択します。

ここに画像の説明を入力してください

次に、もう一度[ 次へ ]をクリックして、インストールを完了させます。それでおしまい。楽しんで。Cygwinは、この不定期の不便を除いて、素晴らしいパッケージです。


Bレイヤーご指導ありがとうございました!このStack Exchangeグループはとても役に立ちます。このサポートに本当に感謝しています。
TPham

1

dos2unixでない場合は、「フリップ」もあります。

$ flip -u yourfilename.txt

UNIXの行末を使用するように反転します。


1

WinSCPでサーバーに接続してbash(.sh)スクリプトを編集するためにNotepad ++を使用しています (WinSCPエディターをNotepad ++に設定するには:https : //winscp.net/eng/docs/ui_editor_preferences

これは、「Vim」エディターの代わりにサーバーからファイルを開いて編集/保存する場合に非常に実用的です。Notepad ++
ファイルを開いたら、下部のステータスバーにある7番目の列をダブルクリックし、[ Unix(LF)]を選択します。

ここに画像の説明を入力してください

また、トップバーのEncoding-> Encode in UTF-8で8番目のものを変更する必要があります。


0

CygwinのBashがMacおよびWindowsの行末エンコーディングでうまく機能するように、実際のファイルの行エンコーディングを変更する必要はありません。ただひっくり返す必要があるオプションがあります。

~/.bash_profile含まれるように更新してください

export SHELLOPTS
set -o igncr

https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.htmlを参照してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.