GNU/Linux >> Linux の 問題 >  >> Linux

予期しないトークン付近の構文エラー ' - bash

@jdt さん、回答ありがとうございます。

それに続いて、キャリッジリターンでこの問題を抱え続けているので、その小さなスクリプトを書きました。 carriage_return のみを実行 ファイルを「クリーニング」するよう求められます。

https://gist.github.com/kartonnade/44e9842ed15cf21a3700

alias carriage_return=remove_carriage_return
remove_carriage_return(){

# cygwin throws error like : 
# syntax error near unexpected token `$'{\r''
# due to carriage return
# this function runs the following
# cat originalfile | tr -d "\r" > newfile

read -p "File to clean ? "
file_to_clean=$REPLY
temp_file_to_clean=$file_to_clean'_'

# file to clean => temporary clean file
remove_carriage_return_one='cat '$file_to_clean' | tr -d "\r" > '
remove_carriage_return_one=$remove_carriage_return_one$temp_file_to_clean

# temporary clean file => new clean file
remove_carriage_return_two='cat '$temp_file_to_clean' | tr -d "\r" > '
remove_carriage_return_two=$remove_carriage_return_two$file_to_clean

eval $remove_carriage_return_one
eval $remove_carriage_return_two
# remove temporary clean file 
eval 'rm '$temp_file_to_clean

}


ファイルのエンコードの問題である可能性があります。

異なるオペレーティング システムやエディター間でファイルを操作しているときに、ファイル タイプのエンコーディングの問題に遭遇しました。私の場合は、特に Linux と Windows システムの間で発生しました。

ファイルのエンコーディングをチェックして、対象の Linux 環境に適していることを確認することをお勧めします。 MAC を使用している場合は、Windows テキスト エディターを使用した場合よりもエンコーディングの問題が発生する可能性は低いと思いますが、ファイル エンコーディングは検討する価値があると思います。

--- 編集 (@Potatoswatter が推奨する実際のソリューションを追加)

ファイル タイプのエンコーディングがどのように問題になるかを示すために、サンプル スクリプトをコピーして Windows のメモ帳に貼り付け (Mac にはアクセスできません)、Linux マシンにコピーして実行しました:

[email protected]:~/windows> sh ./originalfile             
./originalfile: line 2: syntax error near unexpected token `$'{\r''
'/originalfile: line 2: `test() {

この場合、メモ帳は改行と改行を含むファイルを保存したため、上記のエラーが発生しました。 \r 改行を示します (Linux システムでは改行 \n で行を終了します それだけ)。

Linux マシンでは、次のコマンドを実行してファイルからキャリッジ リターンを削除することで、この理論をテストできます (存在する場合)。

cat originalfile | tr -d "\r" > newfile

次に、新しいファイル sh ./newfile を実行してみてください .これが機能する場合、問題は隠し文字としての改行でした。

注: これはあなたの環境を正確に再現したものではありません (私は Mac にアクセスできません) が、エディターがどこかでキャリッジ リターンをファイルに保存したことが問題であると思われます。

--- /編集

少し詳しく説明すると、オペレーティング システムとエディタではファイル エンコーディングのデフォルトが異なる場合があります。通常、アプリケーションとエディターは、使用されるファイルタイプのエンコーディングに影響を与えます。たとえば、Microsoft Notepad と Notepad++ のデフォルトは Windows-1252 だと思います。考慮すべき改行の違いもあります (Windows 環境では、ファイル内の行を終了するためにキャリッジ リターンとラインフィードがよく使用されますが、Linux と OSX では通常、ラインフィードのみが使用されます)。

ファイル エンコーディングを参照する同様の質問と回答はこちら:bash スクリプトの実行で不正な文字が表示される


のようなものを試してください

$ sudo apt-get install dos2unix
$ dos2unix offendingfile

example.sh を変換する簡単な方法 ファイルを UNIX に Windows で作業している場合は、NotePad++ を使用する必要があります ([編集]> [EOL 変換]> [UNIX/OSX 形式])

notepad++ でデフォルトの EOL を設定することもできます ([設定]> [環境設定]> [新しいドキュメント/デフォルト ディレクトリ]> [フォーマット] ボックスで [Unix/OSX] を選択)


Linux
  1. Bashスクリプトでのエラー処理

  2. sudoers構文を確認する方法

  3. 複数の論理演算子、((a || B)&&C)、および「予期しないトークンの近くの構文エラー」?

  1. Bash翻訳ファイルにすべてのエラーテキストが含まれていないのはなぜですか?

  2. Bash:予期しないトークン `}’の近くの構文エラー?

  3. tar エラー:アーカイブに予期しない EOF があります

  1. 構文エラー:ファイルの終わりが予期されていません (その時が予想されます)

  2. 予期しないトークン「then」付近の構文エラー

  3. vim で .bash_aliases の構文強調表示を有効にするにはどうすればよいですか?