ホーム › エラー解決 › Ruby › unexpected end-of-input
Ruby ERROR

Ruby syntax error, unexpected end-of-input の解決法

Rubyで多いのがendの数の間違いです。def・if・doに対してendが足りない/多いと起きます。

このエラーメッセージ

SyntaxError: unexpected end-of-input, expecting `end'

原因

❌ エラーになるコード

NG
def greet(name)
  puts "Hello, #{name}"

greet("progo")

✅ 修正したコード

OK
def greet(name)
  puts "Hello, #{name}"
end
greet("progo")
▶ 修正済みコードを実行エディタで開く
progoのRuby実行環境(インストール不要・登録不要)でその場で動作を確認できます。

解決のポイント

def・if・while・doには必ず対応するendが要ります。開始キーワードとendの数を数えましょう。インデントを揃えると対応が一目で分かります。

メッセージ別・原因早見表

末尾の文言で「endが足りない」のか「endが多い」のかが分かります。方向を間違えると延々見つかりません。

メッセージ意味探し方
unexpected end-of-input, expecting `end'endが足りないdef・if・do・class を数えて足す
unexpected `end'endが多すぎる余分なendを削る
unterminated string meets end of file文字列の"を閉じていない引用符の対応を確認
can't find string "EOS" anywhere before EOFヒアドキュメントの終端が無い終端行の前後の空白・インデントを確認
unexpected ')' / unexpected ','カッコ・カンマの過不足示された行の直前を見る

まず ruby -c で構文だけチェックする

実行せずに構文だけ検査できます。Syntax OKと出ればendの対応は取れています。編集のたびに走らせるのが最短ルートです。

$ ruby -c app.rb
app.rb:5: syntax error, unexpected end-of-input, expecting `end'

$ ruby -wc app.rb   # 未使用変数などの警告も一緒に出す

Ruby 3.2以降はdid_you_meanやerror_highlightが有効で、対応の取れていないdefやifの行を指し示してくれます。Rubyのバージョンが古い場合はrubocopやruby -cを併用してください。

unexpected end-of-input が出る5パターン

「endが足りない」と言われても、どのキーワードの分が足りないのかが分からないと直せません。多い順に5つ挙げます。

NG
class User
  def initialize(name)
    @name = name
  end

  def greet
    [1, 2, 3].each do |i|
      puts "#{i}: #{@name}"
    # ← doに対応するendが無い
  end
end
OK
class User
  def initialize(name)
    @name = name
  end

  def greet
    [1, 2, 3].each do |i|
      puts "#{i}: #{@name}"
    end
  end
end

User.new("progo").greet
▶ 修正済みのクラス例を実行エディタで開く
endの対応が取れていれば、そのまま実行できます。

unexpected `end'(endが多い場合)

逆にendが余るとsyntax error, unexpected `end', expecting end-of-inputになります。多いのは次の2つです。

NG
[1, 2].each { |i| puts i }
end                          # ← 余分
puts "done" if true
end                          # ← 後置ifにendは不要

endの数え方(インデントを味方にする)

Rubyはendの位置を構文的に強制しないため、インデントを揃えることが唯一の目視チェック手段になります。次の手順で機械的に見つかります。

エラー行として報告されるのは多くの場合ファイルの最終行です。Rubyは最後まで読んでから「終わってしまった」と判断するため、最終行の番号は原因の場所ではありません。上へさかのぼって探してください。

他言語の似たメッセージ

検索でたどり着いた方向けに、よく似た文言のエラーを挙げておきます。言語が違えば原因も変わります。

よくある質問

endが多い場合のエラーは?
syntax error, unexpected `end' と出ます。後置ifや { } ブロックに余計なendを付けていないか確認し、余分なendを削ってください。
1行if / ternaryならendは不要?
不要です。puts x if x > 0 のような後置ifや三項演算子にendを付けるとunexpected `end'になります。
エラー行が最終行になります
Rubyはファイルを最後まで読んでから「終わってしまった」と判断するため、最終行が報告されます。原因はもっと上にあるので、上へさかのぼって探してください。
endが足りない場所を素早く見つけるには?
ruby -c ファイル名 で構文だけ検査できます。加えてインデントを2スペースに整形し、開始キーワードとendを同じ列に揃えると、ずれている箇所がすぐ分かります。
do...end と { } は同じ?
ほぼ同じブロックですが、{ } はendで閉じません。do で始めたらend、{ で始めたら } です。混在させると数え間違いの原因になります。
unterminated string meets end of file と出ます
文字列の引用符を閉じ忘れています。以降のコードがすべて文字列扱いになるため、結果的にendも不足します。引用符の対応を先に直してください。
syntax error at end of input は同じエラー?
それはPostgreSQLなどSQL側のメッセージで、クエリが途中で切れている状態です。Rubyのend不足とは別物です。
ヒアドキュメントでエラーになります
can't find string "EOS" anywhere before EOF は終端行が見つからない状態です。終端の識別子の綴りと、<<~EOS でない場合の行頭インデントを確認してください。