web-dev-qa-db-ja.com

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

Macにサンプルスクリプトを作成しました

#!/bin/bash
test() {
  echo "Example"
}
test
exit 0

そして、これは例を表示することでうまく機能します

RedHatマシンでこのスクリプトを実行すると、

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

私はbashが利用可能であることを確認しました

cat /etc/shells

which bash shows /bin/bash 

誰も同じ問題に遭遇しましたか?

前もって感謝します !

12
user3155779

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

異なるオペレーティングシステムとエディター間、特にLinuxとWindowsシステム間でファイルを操作するときに、ファイルタイプのエンコードの問題が発生しました。

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

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

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

jdt@cookielin01:~/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スクリプトの実行に現れる不正な文字

27
jdt

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

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

4
JAR

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

$ Sudo apt-get install dos2unix
$ dos2unix offendingfile
4
Amos Folarin

あなたの答えを@jdtに感謝します。

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

https://Gist.github.com/kartonnade/44e9842ed15cf21a37

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

}

2
kartonnade

上記の回答 に追加したいのは、 Unixのような環境でキャリッジリターンの問題であるかどうかを確認する方法(MacOSでテストした)

1)猫を使う

cat -e my_file_name

行が^M$で終わっている場合は、はい、キャリッジリターンの問題です。

2)復帰文字で最初の行を見つける

grep -r $'\r' Grader.sh | head -1

3)vimを使用する

vim my_file_name

次に、vimで次のように入力します

:set ff

fileformat=dosが表示される場合、ファイルは復帰を含むdos環境からのものです。

見つけた後、他の人が上記の方法を使用してファイルを修正できます。

0
traceformula

私がarmbian linuxとWindowsで作業していたとき、私は同じ問題を抱えていました。私はWindowsからarmbianにコードをコピーしようとしていましたが、実行するとこのエラーがポップアップします。私の問題はこの方法で解決しました:1- WinSCPを使用してWindowsからファイルをコピーしてみます。 2-ファイル名に()文字が含まれていないことを確認します

0