web-dev-qa-db-ja.com

Bash構文エラー:予期しないファイルの終わり

これは、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を実行した後:

構文エラー:予期しないファイルの終わり

82
markcruz

File.shにはCRLF行ターミネーターが付いていると思います。

走る

dos2unix file.sh

その後、問題は修正されます。

これでdos2unixをubuntuにインストールできます。

Sudo apt-get install dos2unix
114
clyfish

もう1つ確認する必要があります(たまたま発生しました):

  • セミコロンで単一行関数の本体を終了する

つまりこの無邪気なスニペットは同じエラーを引き起こします:

die () { test -n "$@" && echo "$@"; exit 1 }

愚かなパーサーを幸せにするには:

die () { test -n "$@" && echo "$@"; exit 1; }
102
ulidtko

また、if句で間違った構文を使用すると、このエラーメッセージが表示されます。

  • else if(構文エラー:予期しないファイルの終わり)
  • Elif(正しい構文)

動作するまでビットをコメントアウトしてデバッグしました

29
marengaz

閉じられていないif => fi節もこれを発生させます

ヒント:スクリプトが巨大な場合は、トラップを使用してデバッグします...

例えばset -x trap read debug ...

12
theRiley

私はこの答えを StackOverflowの同様の問題 から得ました

Vimでファイルを開いて試してください

:set fileformat=unix

Eh行の末尾をUNIXの末尾に変換し、問題が解決するかどうかを確認します。 Vimで編集する場合は、コマンド:set fileformat = unixを入力してファイルを保存します。他のいくつかのエディターには、Notepad ++やAtomなどの行末を変換する機能があります

ありがとう@lemongrassnginger

7
Jay Killeen

cygwinで私が必要としていた:-

 export SHELLOPTS
 set -o igncr

.bash_profileで。このように、unix2dosを実行する必要はありませんでした

6
zzapper

だから私はこの投稿を見つけましたが、答えは私を助けませんでしたが、なぜそれが私にエラーを与えたのかを理解することができました。持っていた

cat > temp.txt < EOF
some content
EOF

問題は、上記のコードをコピーして関数にし、誤ってコードをタブ化したことです。最後のEOFがタブ化されていないことを確認する必要があります。

5
Rafael Urena

Windowsの場合:

私の場合、Windows OSで作業していて、autoconfの実行中に同じエラーが発生しました。

  • NOTEPAD ++ IDEでconfigure.acファイルを開くだけです。
  • 次に、次のようにEOLWindows(CR LF)に変換してファイルを変換しました。

    編集-> EOL変換->ウィンドウ(CR LF)

1
Juniar

コードを切り取ってファイルに貼り付けることができ、正しく実行されました。このように実行すると動作するはずです:

あなたの「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
1
aaronstacy

これは、括弧を使用して関数を呼び出そうとしたときに起こっていました。

run() {
  echo hello
}

run()

する必要があります:

run() {
  echo hello
}

run
1
Christian Scott

「if-fi」ステートメントを1行で記述したときに問題が発生しました。

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

問題を解決した複数行を書く:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

1
Sergey

私はパーティーに遅すぎることを知っています。これが誰かを助けることを願っています。

.bashrcファイルを確認してください。おそらく名前を変更するか、移動してください。

ここでの議論: 単純なbashスクリプトを入手できません

0
viggy28

Ubuntuの場合:

$ gedit ~/.profile

次に、File -> Save asを設定し、end lineUnix/Linuxに設定します

0
Neb

あなたの例をファイルにカットアンドペーストしました。それはbashの下でうまく走りました。問題はありません。

適切な測定のために、bashは気にしないはずですが、改行で終わることを確認したい場合があります。 (最終改行の有無にかかわらず、私のために実行されます。)

誤って制御文字をファイルに埋め込んだ場合、奇妙なエラーが表示されることがあります。これは短いスクリプトなので、ここで質問からStackOverflowに貼り付けるか、単純に再入力して、新しいスクリプトを作成してみてください。

どのバージョンのbashを使用していますか? (bash --version

幸運を!

0
Adam Liss

MacOSを使用している場合:

Windows形式のファイルを受け取り、MacOSで実行したい場合にこのエラーが表示される場合は、これらのコマンドを実行します。

brew install dos2unix
sh <file.sh>
0
vmorusu

.shファイルが存在するディレクトリの名前にスペース文字が含まれていないことを確認してください。例:「New Folder」というフォルダにある場合、引用したエラーに遭遇することになります。代わりに、「New_Folder」という名前を付けてください。これがお役に立てば幸いです。

0
user5770325

どうやら、シェルの一部のバージョンは、スクリプトの最終行に改行がない場合にもこのメッセージを出力できます。

0
tripleee