我需要传递一个文本文件作为参数,而不是在代码中打开它。文本文件的内容应该在控制台上打印。我已经完成了以下代码:
REINSTALLMODE="amus"
请建议。
答案 0 :(得分:2)
在shell上,调用ruby
脚本,后跟.txt
文件的名称,如下所示:
ruby foo.rb test_list.txt
变量ARGV
将包含对调用ruby
解释器时传递的所有参数的引用。特别是ARGV[0] = "test_list.txt"
,因此您可以使用此代替硬编码文件的名称:
File.open(ARGV[0]).each do |line|
puts line
end
另一方面,如果您想将文件的内容传递给您的程序,可以使用:
cat test_list.txt | ruby foo.rb
并在程序中:
STDIN.each_line do |line|
puts line
end
答案 1 :(得分:0)
Ruby有Perl / awk / sed根。与Perl和awk一样,如果在命令行中使用相同的代码提供stdin或打开文件名,则可以使用'magic'。
假设:
$ cat file
line 1
line 2
line 3
您可以编写一个cat
之类的实用程序来打开命名文件:
$ ruby -lne 'puts $_' file
line 1
line 2
line 3
或者,相同的代码,将逐行读取stdin:
$ cat file | ruby -lne 'puts $_'
line 1
line 2
line 3
在这种特殊情况下,它来自Ruby的-lne
命令行参数。
-n Causes Ruby to assume the following loop around your
script, which makes it iterate over file name arguments
somewhat like sed -n or awk.
while gets
...
end
-l (The lowercase letter ``ell''.) Enables automatic line-
ending processing, which means to firstly set $\ to the
value of $/, and secondly chops every line read using
chop!.
-e command Specifies script from command-line while telling Ruby not
to search the rest of the arguments for a script file
name.
不使用-n
开关,您还可以使用ARGF流并修改代码,以便它以相同的方式使用stdin
或命名文件。
命名文件:
$ ruby -e '$<.each_line do |line|
puts line
end' file
line 1
line 2
line 3
使用相同的代码阅读stdin
:
$ cat file | ruby -e '$<.each_line do |line|
puts line
end'
line 1
line 2
line 3