web-dev-qa-db-ja.com

「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  

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

13
TPham

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

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

dos2unix scriptnameを実行すると、大丈夫です。


dos2unixがない場合、次のコードはほぼどこでも機能します(WindowsのMobaXtermでテストしました)。

vi -b filename

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

:%s/\r$//
:x

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


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

set fileformat = unix
:w + fileformat = unix

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

29
Wildcard

これは、DOSの行末を使用するエディター(Notepad ++など)によってスクリプトが保存されているためです。これらをスクリプトから削除する必要があります。

これを行うには、スクリプトファイルでdos2unixを使用するか、

$ tr -d '\r' <script >script.new && mv script.new script

(これにより、スクリプトのanywhereからすべての改行が削除されます)


スクリプトのコードについて:

:
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

ブレース展開を理解するシェルで。

10
Kusalananda

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

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

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

5
Fox

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

まず、通常のテキストファイルの場合、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などの名前の付いたものです。次のような画面が表示されることを確認してください。

enter image description here

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

enter image description here

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

3
B Layer

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

$ flip -u yourfilename.txt

uNIXの行末を使用するように切り替えます。

1
chai

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

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

enter image description here

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

1
Alper t. Turker

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

~/.bash_profileを更新して、

export SHELLOPTS
set -o igncr

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

0
swdev