Posted at

文字列のダブルクォーテーションの扱いに関して

More than 1 year has passed since last update.


パースエラー

以下のコマンドのエラーの原因を考えてみましょう

ruby -e " 100.times{|n| puts "a" } "

シンタックスハイライトを見ればわかる通り、aの部分をも文字列として扱いたいのに途中でダブルクォーテーションが使われているため、以下のようなエラーが表示されます。(ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]を使用しました。)

-e:1:in `block in <main>': undefined local variable or method `a' for main:Object (NameError)

from -e:1:in `times'
from -e:1:in `<main>'

おもな回避方法は2つあります。


シングルクォーテーションに置き換える

以下の二つのコードはエラーが出ずにきちんと表示されます。

ruby -e '100.times.do{|n| puts "a"}'

ruby -e "100.times.do{|n| puts 'a'}"

上のコードははじめと終わり、下のコードは2番目と3番目をシングルクォーテーションに置き換えました。もし、はじめのダブルクォーテーションだけを置き換えたら何が起こるでしょうか?

ruby -e '100.times{|n| puts "a"}"

文字列のはじめを表すシングルクォーテーションしかないため、エンターを押してもコマンドが終わってないものだと認識され、入力の続きを求められます。

こういう場合はCtrl + D一回使って終わらせましょう。(押す回数は一回で大丈夫です)


エスケープシークエンスを使う。

ダブルクォーテーションを使った文字列の中でどうしても、ダブルクォーテーションを使いたいというときがあると思います。そういう時に使うのがエスケープシーケンスです。

使い方は文字列として扱いたいダブルクォーテーションの前にバッククォート(Windowsなら¥)を入れるだけです。

ruby -e "100.times{|n| puts \"a\"}"