1. ホーム
  2. Linux

エラーとなったシェルスクリプトを実行します。"予期しないトークン付近の構文エラーに対する解決策`"

2022-02-16 10:43:32
<パス

エラー: "予期しないトークン付近の構文エラーに対する解決策`".を含むシェルスクリプトを実行します。

今日、Cshellスクリプトを書いて、エラーsyntax error near unexpected token `で実行したところ、スクリプトの構文は問題なく、ようやく問題を発見しました。

  Open your SHELL script file with the command vi -b and you will. Find an extra ^M at the end of each line of the script.


昔のテレタイプライターは、改行するのに、2つの文字を使っていました。1文字はスライドを最初の位置に戻し(キャリッジリターン、ASCII 0Dと呼ぶ)、もう1文字は紙を1行上に移動させる(ラインフィード、ASCII 0Aと呼ぶ)ものである。コンピュータが登場した当時、メモリは非常に高価なものだった。UNIXの開発者は行末を1文字にすればいいと考え、LinuxはUnixに追随し、Appleの開発者も同様だった。MS-DOSやWindowsを開発した人たちは、古いスタイルにこだわることにしたのです。

MS-DOSやWindowsでは、キャリッジリターン+ラインフィードで改行を表すので、LinuxのVimで行末の"^M"記号は、WindowsのVCで書いたコードを見るときに、文字を表すことになるのです。

Vimでのこの問題の解決方法は、Vimのreplace機能を使って、以下のreplaceコマンドラインを入力することで、すべての"^Ms"を取り除くだけと簡単です。

1) vi -b setup.sh

2)コマンド編集行で<は: ESCを押してshift+:コロン>タイプ: %s/^M//g。

注:上記のコマンドラインの ^M は M + ^ ではなく、 "Ctrl+v" と "Ctrl+M" で生成されたものです。

これを置き換えたら、保存すれば実行されます。もちろん、他にも以下のような置き換え方法があります。

a. linux のバージョンによっては dos2unix プログラムがあり、それを使って ^M を取り除くことができます。

b.cat filename1 | tr -d "\r" > newfile 新しいファイルを生成するために^Mを取り除く、sedコマンドなど。置き換えられるものはすべて新しいファイルを生成するために使用されます。
上記のように^Mを削除すると^Mシェルスクリプトは正常に動作したのですが、その後同僚に聞いたところ、Windowsのメモ帳でプログラムパスを変更したため、各行に余分な^Mがついてしまったことが判明しました。