パースエラー
以下のコマンドのエラーの原因を考えてみましょう
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\"}"