其中大部分和 Shell 传递参数很像。既然提到了预定义变量和常量,就顺便把 English 库也说一下,在 Ruby 脚本中使用 English 库,你就可以使用不那么难懂的名称去引用全局变量了(看完下边的例子你就豁然开朗了)。
预定义变量
$_ gets 方法最后读取的字符串
[95] pry(main)> io = File.open("test.txt")
=> #<File:test.txt>
[96] pry(main)> io.gets
=> "hello\n"
[97] pry(main)> io.gets
=> "world\n"
[98] pry(main)> $_
=> "world\n"
[5] pry(main)> $LAST_READ_LINE
=> "world\n"
$& 最后一次模式匹配得到的字符串
[100] pry(main)> "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
[101] pry(main)> $&
=> "12:41 INFO User has logged in."
[8] pry(main)> $MATCH
=> "12:41 INFO User has logged in."
$~ 最后一次模式匹配相关的信息
[100] pry(main)> "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
[102] pry(main)> $~
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
[10] pry(main)> $LAST_MATCH_INFO
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
$` 最后一次模式匹配中匹配部分之前的字符串
[1] pry(main)> "hello world" =~ /ll/
=> 2
[2] pry(main)> $`
=> "he"
[14] pry(main)> $PREMATCH
=> "he"
$' 最后一次模式匹配中匹配部分之后的字符串
[1] pry(main)> "hello world" =~ /ll/
=> 2
[3] pry(main)> $'
=> "o world"
[16] pry(main)> $POSTMATCH
=> "o world"
$+ 最后一次模式匹配中最后一个()对应的字符串
[5] pry(main)> "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
[6] pry(main)> $+
=> "User has logged in."
[19] pry(main)> $LAST_PAREN_MATCH
=> "User has logged in."
$1、$2 最后一次模式匹配中()匹配的字符串(第 n 个 () 对应 $n)
[5] pry(main)> "12:41 INFO User has logged in.".match(/(\d{2}:\d{2}) (\w+) (.*)/)
=> #<MatchData "12:41 INFO User has logged in." 1:"12:41" 2:"INFO" 3:"User has logged in.">
[7] pry(main)> $1
=> "12:41"
[8] pry(main)> $2
=> "INFO"
$? 最后执行完毕的子进程状态
[9] pry(main)> $?
=> #<Process::Status: pid 5133 exit 0>
[21] pry(main)> $CHILD_STATUS
=> #<Process::Status: pid 5133 exit 0>
$! 最后发生的异常的相关信息
[29] pry(main)> $!
=> nil
[27] pry(main)> $ERROR_INFO
=> nil
$@ 最后发生的异常的相关位置信息
[30] pry(main)> $@
=> nil
[28] pry(main)> $ERROR_POSITION
=> nil
$SAFE 安全级别(默认为 0)
[19] pry(main)> $SAFE
(pry):19: warning: $SAFE will become a normal global variable in Ruby 3.0
=> 0
$/ 输入数据的分隔符(默认为 “\n”)
[20] pry(main)> $/
=> "\n"
[22] pry(main)> $INPUT_RECORD_SEPARATOR
=> "\n"
[23] pry(main)> $RS
=> "\n"
$\ 输出数据的分隔符(默认为 nil)
[46] pry(main)> "#{$\}"
=> ""
[47] pry(main)> $OUTPUT_RECORD_SEPARATOR
=> nil
[48] pry(main)> $ORS
=> nil
$, Array#join 的默认分割字符串(默认为 nil)
[52] pry(main)> "#{$,}"
=> ""
[53] pry(main)> $OUTPUT_FIELD_SEPARATOR
=> nil
[54] pry(main)> $OFS
=> nil
$; String#split 的默认分割字符串(默认为 nil)
[40] pry(main)> $;
[41] pry(main)> $FIELD_SEPARATOR
=> nil
[42] pry(main)> $FS
=> nil
$. 最后读取的文件行号
[25] pry(main)> $.
=> 2351
[24] pry(main)> $INPUT_LINE_NUMBER
=> 2351
$< ARGF 的别名
[26] pry(main)> $<
=> ARGF
[26] pry(main)> $DEFAULT_INPUT
=> ARGF
$> print、puts、p 等的默认输出位置(默认为 STDOUT)
[34] pry(main)> $>
=> #<IO:<STDOUT>>
[29] pry(main)> $DEFAULT_OUTPUT
=> #<IO:<STDOUT>>
$0 $PROGRAM_NAME 的别名
[32] pry(main)> $0
=> "pry"
[30] pry(main)> $PROGRAM_NAME
=> "pry"
$* ARGV 的别名
[35] pry(main)> $*
=> []
[33] pry(main)> $ARGV
=> []
$$ 当前执行中的 Ruby 的进程 ID
[36] pry(main)> $$
=> 5126
[34] pry(main)> $PROCESS_ID
=> 5126
$: $LOAD_PATH 的别名
[37] pry(main)> $:
=> ["/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/coderay-1.1.3/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/method_source-1.0.0/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/pry-0.13.1/lib",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux"]
[62] pry(main)> $LOAD_PATH
=> ["/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/coderay-1.1.3/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/method_source-1.0.0/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/pry-0.13.1/lib",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux"]
$" $LOADED_FEATURES 的别名
[38] pry(main)> $"
=> ["enumerator.so",
"thread.rb",
"rational.so",
"complex.so",
"ruby2_keywords.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/rbconfig.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/compatibility.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/defaults.rb",
[63] pry(main)> $LOADED_FEATURES
=> ["enumerator.so",
"thread.rb",
"rational.so",
"complex.so",
"ruby2_keywords.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/rbconfig.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/compatibility.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/defaults.rb",
$DEBUG 指定 DEBUG 模式的标识
[4] pry(main)> $DEBUG
=> false
$FILENAME ARGF 当前在读的文件名
[6] pry(main)> $FILENAME
=> "-"
$LOAD_PATH 执行 require 读取文件时搜索的目录名数组
[7] pry(main)> $LOAD_PATH
=> ["/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/coderay-1.1.3/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/method_source-1.0.0/lib",
"/usr/local/ruby-2.7.1/lib/ruby/gems/2.7.0/gems/pry-0.13.1/lib",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/site_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby/2.7.0/x86_64-linux",
"/usr/local/ruby-2.7.1/lib/ruby/vendor_ruby",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux"]
$stdin 标准输入(默认为 STDIN)
[8] pry(main)> $stdin
=> #<IO:<STDIN>>
$stdout 标准输出(默认为 STDOUT)
[9] pry(main)> $stdout
=> #<IO:<STDOUT>>
$stderr 标准错误输出(默认为 STDERR)
[10] pry(main)> $stderr
=> #<IO:<STDERR>>
$VERBOSE 指定冗长模式的标识(默认为 nil)
[11] pry(main)> $VERBOSE
=> false
$PROGRAM_NAME 当前执行中的 Ruby 脚本别名
[12] pry(main)> $PROGRAM_NAME
=> "pry"
$LOADED_FEATURES require 读取的类库名一览表
[13] pry(main)> $LOADED_FEATURES
=> ["enumerator.so",
"thread.rb",
"rational.so",
"complex.so",
"ruby2_keywords.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/encdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/enc/trans/transdb.so",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/x86_64-linux/rbconfig.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/compatibility.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/defaults.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/deprecate.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/errors.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/version.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/requirement.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/platform.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/basic_specification.rb",
"/usr/local/ruby-2.7.1/lib/ruby/2.7.0/rubygems/stub_specification.rb",
预定义常量
ARGF
[1] pry(main)> ARGF
=> ARGF
ARGV
[2] pry(main)> ARGV
=> []
ENV
[5] pry(main)> ENV
=> {"CLASSPATH"=>":/usr/lib/jvm/java/lib:/usr/lib/jvm/java/jre/lib",
"COLUMNS"=>"119",
"HISTCONTROL"=>"ignoredups",
"HISTSIZE"=>"1000",
"HOME"=>"/root",
"HOSTNAME"=>"master",
"JAVA_HOME"=>"/usr/lib/jvm/java",
"JENKINS_HOME"=>"/var/lib/jenkins/",
"JRE_HOME"=>"/usr/lib/jvm/java/jre",
"LANG"=>"en_US.UTF-8",
"LESSOPEN"=>"||/usr/bin/lesspipe.sh %s",
"LINES"=>"18",
"LOGNAME"=>"root",
...
RUBY_COPYRIGHT
[8] pry(main)> RUBY_COPYRIGHT
=> "ruby - Copyright (C) 1993-2020 Yukihiro Matsumoto"
RUBY_DESCRIPTION
[9] pry(main)> RUBY_DESCRIPTION
=> "ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]"
RUBY_ENGINE
[10] pry(main)> RUBY_ENGINE
=> "ruby"
RUBY_PATCHLEVEL
[12] pry(main)> RUBY_PATCHLEVEL
=> 83
RUBY_PLATFORM
[13] pry(main)> RUBY_PLATFORM
=> "x86_64-linux"
RUBY_RELEASE_DATE
[14] pry(main)> RUBY_RELEASE_DATE
=> "2020-03-31"
RUBY_VERSION
[15] pry(main)> RUBY_VERSION
=> "2.7.1"
STDERR
[16] pry(main)> STDERR
=> #<IO:<STDERR>>
STDIN
[17] pry(main)> STDIN
=> #<IO:<STDIN>>
STDOUT
[18] pry(main)> STDOUT
=> #<IO:<STDOUT>>
self
[1] pry(main)> self
=> main
__FILE__
[2] pry(main)> __FILE__
=> "(pry)"
__LINE__
[3] pry(main)> __LINE__
=> 3
__ENCODING__
[4] pry(main)> __ENCODING__
=> #<Encoding:UTF-8>