これは、Bashの非常に単純なスクリプトです。コードは次のとおりです。
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 Host database username"
exit 0
fi
sh file.shを実行した後:
構文エラー:予期しないファイルの終わり
File.shにはCRLF行ターミネーターが付いていると思います。
走る
dos2unix file.sh
その後、問題は修正されます。
これでdos2unixをubuntuにインストールできます。
Sudo apt-get install dos2unix
もう1つ確認する必要があります(たまたま発生しました):
つまりこの無邪気なスニペットは同じエラーを引き起こします:
die () { test -n "$@" && echo "$@"; exit 1 }
愚かなパーサーを幸せにするには:
die () { test -n "$@" && echo "$@"; exit 1; }
また、if
句で間違った構文を使用すると、このエラーメッセージが表示されます。
else if
(構文エラー:予期しないファイルの終わり)Elif
(正しい構文)動作するまでビットをコメントアウトしてデバッグしました
閉じられていないif => fi節もこれを発生させます
ヒント:スクリプトが巨大な場合は、トラップを使用してデバッグします...
例えばset -x trap read debug ...
私はこの答えを StackOverflowの同様の問題 から得ました
Vimでファイルを開いて試してください
:set fileformat=unix
Eh行の末尾をUNIXの末尾に変換し、問題が解決するかどうかを確認します。 Vimで編集する場合は、コマンド:set fileformat = unixを入力してファイルを保存します。他のいくつかのエディターには、Notepad ++やAtomなどの行末を変換する機能があります
ありがとう@lemongrassnginger
cygwinで私が必要としていた:-
export SHELLOPTS
set -o igncr
.bash_profileで。このように、unix2dosを実行する必要はありませんでした
だから私はこの投稿を見つけましたが、答えは私を助けませんでしたが、なぜそれが私にエラーを与えたのかを理解することができました。持っていた
cat > temp.txt < EOF
some content
EOF
問題は、上記のコードをコピーして関数にし、誤ってコードをタブ化したことです。最後のEOFがタブ化されていないことを確認する必要があります。
Windowsの場合:
私の場合、Windows OSで作業していて、autoconfの実行中に同じエラーが発生しました。
次に、次のようにEOLにWindows(CR LF)に変換してファイルを変換しました。
編集-> EOL変換->ウィンドウ(CR LF)
コードを切り取ってファイルに貼り付けることができ、正しく実行されました。このように実行すると動作するはずです:
あなたの「file.sh」:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 Host database username"
exit 0
fi
コマンド:
$ ./file.sh arg1 arg2 arg3
「file.sh」は実行可能である必要があることに注意してください。
$ chmod +x file.sh
入力方法(パイプ、ニンジンなど)のエラーb/cが発生している可能性があります。条件を2つに分割してみることもできます。
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 Host database username"
exit 0
fi
または、bash
を使用しているため、組み込み構文を使用できます。
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 Host database username"
exit 0
fi
そして、最後に、もちろん3つの引数が指定されているかどうかを確認できます(クリーンで、POSIXシェルの互換性を維持します)。
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 Host database username"
exit 0
fi
これは、括弧を使用して関数を呼び出そうとしたときに起こっていました。
run() {
echo hello
}
run()
する必要があります:
run() {
echo hello
}
run
「if-fi」ステートメントを1行で記述したときに問題が発生しました。
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
問題を解決した複数行を書く:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
私はパーティーに遅すぎることを知っています。これが誰かを助けることを願っています。
.bashrcファイルを確認してください。おそらく名前を変更するか、移動してください。
ここでの議論: 単純なbashスクリプトを入手できません
Ubuntuの場合:
$ gedit ~/.profile
次に、File -> Save as
を設定し、end line
をUnix/Linux
に設定します
あなたの例をファイルにカットアンドペーストしました。それはbashの下でうまく走りました。問題はありません。
適切な測定のために、bashは気にしないはずですが、改行で終わることを確認したい場合があります。 (最終改行の有無にかかわらず、私のために実行されます。)
誤って制御文字をファイルに埋め込んだ場合、奇妙なエラーが表示されることがあります。これは短いスクリプトなので、ここで質問からStackOverflowに貼り付けるか、単純に再入力して、新しいスクリプトを作成してみてください。
どのバージョンのbashを使用していますか? (bash --version
)
幸運を!
MacOSを使用している場合:
Windows形式のファイルを受け取り、MacOSで実行したい場合にこのエラーが表示される場合は、これらのコマンドを実行します。
brew install dos2unix
sh <file.sh>
.shファイルが存在するディレクトリの名前にスペース文字が含まれていないことを確認してください。例:「New Folder」というフォルダにある場合、引用したエラーに遭遇することになります。代わりに、「New_Folder」という名前を付けてください。これがお役に立てば幸いです。
どうやら、シェルの一部のバージョンは、スクリプトの最終行に改行がない場合にもこのメッセージを出力できます。