Macにサンプルスクリプトを作成しました
#!/bin/bash
test() {
echo "Example"
}
test
exit 0
そして、これは例を表示することでうまく機能します
RedHatマシンでこのスクリプトを実行すると、
予期しないトークンの近くの構文エラー '
私はbashが利用可能であることを確認しました
cat /etc/shells
which bash shows /bin/bash
誰も同じ問題に遭遇しましたか?
前もって感謝します !
ファイルのエンコードの問題である可能性があります。
異なるオペレーティングシステムとエディター間、特に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スクリプトの実行に現れる不正な文字
簡単な変換方法example.sh
ファイルをUNIX
にWindowsで作業している場合は、NotePad ++を使用します(編集> EOL変換> UNIX/OSX形式)
Notepad ++でデフォルトのEOLを設定することもできます([設定]> [設定]> [新規ドキュメント/デフォルトディレクトリ]> [フォーマット]ボックスでUnix/OSXを選択)
のようなものを試してください
$ Sudo apt-get install dos2unix
$ dos2unix offendingfile
あなたの答えを@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
}
上記の回答 に追加したいのは、 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環境からのものです。
見つけた後、他の人が上記の方法を使用してファイルを修正できます。
私がarmbian linuxとWindowsで作業していたとき、私は同じ問題を抱えていました。私はWindowsからarmbianにコードをコピーしようとしていましたが、実行するとこのエラーがポップアップします。私の問題はこの方法で解決しました:1- WinSCPを使用してWindowsからファイルをコピーしてみます。 2-ファイル名に()文字が含まれていないことを確認します