簡體   English   中英

接受命令行參數到Ruby腳本

[英]Accepting Command-Line Arguments into a Ruby Script

我正在嘗試使用以下代碼在文件中接受作為終端中的參數,然后將讀取該更新並使用其內容更新body變量。 如果文件沒有傳入,那么我想要提示用戶可以輸入自己的正文副本。


require 'posterous'

Posterous.config = {
  'username'  => 'name',
  'password'  => 'pass',
  'api_token' => 'token'
}

include Posterous
@site = Site.primary

#GETS POST TITLE
puts "Post title: "
title = STDIN.gets.chomp()

if defined?(ARGV)
  filename = ARGV.first
end

if (defined?(filename))
  body = File.open(filename)
  body = body.read()
else
  puts "Post body: "
  body = STDIN.gets.chomp()
end
puts body

當我在沒有傳入文件的情況下運行程序時,我得到了這個:


Post title: 
Hello
posterous.rb:21:in `initialize': can't convert nil into String (TypeError)
    from posterous.rb:21:in `open'
    from posterous.rb:21:in `'

我對紅寶石很新,因此不是最好的。 我試過交換很多東西並改變一些事情,但無濟於事。 我究竟做錯了什么?

defined?(ARGV)不會返回布爾值false ,而是返回"constant" 由於這不會被評估為false ,因此filename被定義為ARGV[0] ,即nil

>> ARGV
=> []
>> defined?(ARGV)
=> "constant"
?> ARGV.first
=> nil

相反,你可以檢查ARGV的長度:

if ARGV.length > 0
  filename = ARGV.first.chomp
end

來自文檔:

界定? 表達式測試表達式是否引用任何可識別的內容(文本對象,已初始化的局部變量,從當前作用域可見的方法名稱等)。 如果無法解析表達式,則返回值為nil。 否則,返回值提供有關表達式的信息。

邁克爾給了你問題的基本答案。 稍微多一點的Rubyish方式是使用ARGF進行閱讀; 那么條件只需要決定是否打印提示:

puts "Post title: "
title = gets.chomp

puts "Post body: " if ARGV.length == 0
body = ARGF.gets.chomp
puts body

..當然,如果你不需要任何其他身體,你可以跳過存儲文件的內容,只是做

puts ARGF.gets.chomp

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM