ラップトップ(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
誰かがこの問題を回避する方法を説明してくれませんか?
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
これについて詳しくは、このテーマをカバーする以下の多くの質問と回答をご覧ください。
これは、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.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
ブレース展開を理解するシェルで。
スクリプトの行末が間違っています。 WindowsはCR + LF(\ r\n)を使用し、UnixはLF(\ n)を使用し、Classic MacOSはCR(\ r)を使用します。行末を変更する必要がありますテキストエディタまたはdos2unix
などのスタンドアロンツールを使用した、影響を受けるすべてのファイル.
FTPおよびSVNのようなバージョン管理システムは、行末を適切に変換できる傾向があるため、将来、ファイルを転送するためのオプションを検討する必要がある場合があります。
これらのファイルではないが転送されているが、1台のマシンでのみ使用されている場合は、お好みのテキストエディタで行末の設定を確認する必要があります。 「プログラマー向け」として宣伝されているほとんどの場合、このようなオプションがあります。
補足的な回答として、いくつかのメモ/ヒントを追加しましょう...
まず、通常のテキストファイルの場合、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などの名前の付いたものです。次のような画面が表示されることを確認してください。
すでにプライマリインストールが完了しているので、選択画面が表示されるまでNextをクリックすることができます。ドロップダウンで[完全]を選択し、検索ボックスに「dos2」と入力して、次のようにツールを選択します。
次にNextをもう一度クリックして、インストールを完了させます。それでおしまい。楽しんで。 Cygwinは、この時々の不便さを除いて、素晴らしいパッケージです。
Dos2unixでない場合は、「フリップ」もあります。
$ flip -u yourfilename.txt
uNIXの行末を使用するように切り替えます。
私はNotepad ++を使用して、サーバーにWinSCPで接続することにより、bash(.sh)スクリプトを編集します。
(WinSCPエディターをNotepad ++に設定するには: https://winscp.net/eng/docs/ui_editor_preferences )
これは、 "Vim"エディターの代わりに、サーバーからファイルを開いて編集/保存する場合に非常に実用的です。
Notepad ++でファイルを開いたら、下部のステータスバーにある7番目の列をダブルクリックして、「nix(LF)」を選択します。
また、トップバーのEncoding-> Encode in UTF-8で8番目のものを変更する必要があります。
CygwinのBashがMacおよびWindowsの行末エンコーディングで正常に動作するように、実際のファイルの行エンコーディングを変更する必要はありません。あなたが裏返す必要があるオプションがあります。
~/.bash_profile
を更新して、
export SHELLOPTS
set -o igncr
https://ptolemy.berkeley.edu/projects/chess/softdevel/faq/5.html を参照してください