解析命令行選項(xiàng)Ruby方式(OptionParser)

Ruby配備了強(qiáng)大而靈活的工具來(lái)解析命令行選項(xiàng)OptionParser。一旦你學(xué)會(huì)了如何使用它,你永遠(yuǎn)不會(huì)回到手動(dòng)查看ARGV。OptionParser具有許多功能,使其對(duì)Ruby程序員非常有吸引力。如果您'使用Ruby或C手動(dòng)解析選項(xiàng),或使用getoptlongC函數(shù),您'將會(huì)看到其中一些更改有多受歡迎。

  • OptionParser是干燥的。您只需編寫(xiě)命令行開(kāi)關(guān),其參數(shù),遇到時(shí)要運(yùn)行的代碼'以及腳本中一次的命令行開(kāi)關(guān)描述。OptionParser將自動(dòng)從此描述中為您生成幫助屏幕,并從其描述中推斷出有關(guān)參數(shù)的所有信息。例如,它會(huì)知道-file[file]選項(xiàng)是可選的,只需要一個(gè)參數(shù)。此外,它會(huì)知道-[-no]-verbose實(shí)際上是兩個(gè)選項(xiàng),將接受兩種形式。
  • OptionParser將自動(dòng)將選項(xiàng)轉(zhuǎn)換為特定類。如果選項(xiàng)采用整數(shù),它可以將在命令行上傳遞的任何字符串轉(zhuǎn)換為整數(shù)。這減少了解析命令行選項(xiàng)所涉及的一些繁瑣內(nèi)容。
  • 一切都非常包含。所有選項(xiàng)都在同一位置,選項(xiàng)的效果是右側(cè)是選項(xiàng)的定義。如果必須添加,更改選項(xiàng)或有人只想查看他們的工作,則只有一個(gè)地方可以查看。解析命令行后,單個(gè)哈?;騉penStruct將保留結(jié)果。

已經(jīng)足夠了,向我顯示一些代碼

所以這里'是如何使用OptionParser的簡(jiǎn)單例子。它不使用任何**功能,只是基礎(chǔ)知識(shí)。有三個(gè)選項(xiàng),其中一個(gè)選項(xiàng)有一個(gè)參數(shù)。所有選項(xiàng)都是強(qiáng)制性的。有-v/--verbose-q/--quick選項(xiàng),以及-l/-logfile FILE選項(xiàng)。此外,腳本還采用獨(dú)立于選項(xiàng)的文件列表。

#!/usr/bin/env ruby

#一個(gè)腳本,假裝調(diào)整多個(gè)圖像

require'optparse'


#此哈希將保存所有選項(xiàng)

#從命令行解析

#OptionParser。

選項(xiàng)={}


optparse=OptionParser.newdo | opts |

#設(shè)置橫幅,顯示在幫助屏幕的頂部

#。

opts.banner="用法:optparse1.rb[選項(xiàng)]文件1文件2…"


#定義選項(xiàng),以及他們做的

選項(xiàng)[:verbose]=false

opts.on('-v','--verbose','輸出更多信息')做

選項(xiàng)[:verbose]=true

end


選項(xiàng)[:quick]=false

opts.on('-q','--quick','快速執(zhí)行任務(wù)')do 111>
選項(xiàng)[:quick]=true

end


選項(xiàng)[:logfile]=無(wú)

opts.on('-l','--log FILE FILE','將日志寫(xiě)入文件')do | FILE |

選項(xiàng)[:logfile]=FILE

end


#這顯示幫助屏幕,所有程序均

#假定具有此選項(xiàng)。

opts.on('-h健康知識(shí)手抄報(bào)圖片大全','--help','顯示此屏幕')do

放置opts

退出

結(jié)束

結(jié)束


#解析命令行。請(qǐng)記住,解析方法有兩種形式

#。'解析'方法只是解析

#ARGV,而'解析!'方法解析ARGV并刪除

?在那里找到的任何選項(xiàng),以及

的任何參數(shù)
#選項(xiàng)。剩下的'是要調(diào)整大小的文件列表。

optparse.parse!


輸入"逐字&##34;如果選項(xiàng)[:verbose]

輸入\35;#34;快速&35;#34;如果選項(xiàng)[:快速]


輸入\\35;#34;登錄到文件35>


ARGV.each做| f |

放置"調(diào)整圖像#{f}…"

睡眠0.5

結(jié)束

檢查代碼

首先,需要optparse庫(kù)。請(qǐng)記住,這不是'寶石。它帶有紅寶石,所以在optparse之前不需要安裝寶石或需要rubygems。

這個(gè)腳本中有兩個(gè)有趣的對(duì)象。第一個(gè)是選項(xiàng),在最上面的范圍內(nèi)聲明。它'一個(gè)簡(jiǎn)單的空散列。定義選項(xiàng)時(shí),它們將默認(rèn)值寫(xiě)入此哈希。例如,默認(rèn)行為是此腳本not為verbose,因此選項(xiàng)[:verbose]設(shè)置為false。當(dāng)在命令行上遇到選項(xiàng)時(shí),它們會(huì)更改選項(xiàng)中的值以反映其效果。例如,當(dāng)遇到-v/-verbose時(shí),它將為選項(xiàng)[:verbose]分配true。

第二個(gè)有趣的對(duì)象是optparse。這是OptionParser對(duì)象本身。構(gòu)建此對(duì)象時(shí),將其傳遞一個(gè)塊。該塊在構(gòu)建過(guò)程中運(yùn)行,并將在內(nèi)部數(shù)據(jù)結(jié)構(gòu)中構(gòu)建選項(xiàng)列表,并準(zhǔn)備好解析所有內(nèi)容。它'在這個(gè)區(qū)塊中,所有的魔術(shù)都發(fā)生了。您在這里定義所有選項(xiàng)。

定義選項(xiàng)

每個(gè)選項(xiàng)遵循相同的模式。您首先將默認(rèn)值寫(xiě)入哈希中。一旦構(gòu)建了OptionParser,就會(huì)發(fā)生這種情況。接下來(lái),你打電話給254在方法上,它定義了選項(xiàng)本身。這種方法有幾種形式,但這里只使用一種。其他表單允許您定義一個(gè)選項(xiàng)僅限于的自動(dòng)類型轉(zhuǎn)換和值集。這里使用的三個(gè)參數(shù)是選項(xiàng)的簡(jiǎn)短形式,長(zhǎng)形式和描述。

on方法將從長(zhǎng)形式推斷出許多東西。有一件事會(huì)推斷出任何參數(shù)的存在。如果選項(xiàng)中存在任何參數(shù),它將把它們作為參數(shù)傳遞給塊。

如果在命令行上遇到該選項(xiàng),則運(yùn)行傳遞給on方法的塊。在這里,塊不會(huì)'做得很多,它們只是在選項(xiàng)哈希中設(shè)置值??梢宰龈嗟墓ぷ?,例如檢查引用的文件是否存在等。如果有任何錯(cuò)誤,可以從這些塊中投擲異常。

最后,解析命令行。這是通過(guò)調(diào)用解析發(fā)生的!OptionParser對(duì)象上的方法。實(shí)際上這種方法有兩種形式,parseparse!。正如感嘆號(hào)所暗示的那樣,它具有破壞性。它不僅解析命令行,還將刪除從ARGV中找到的任何選項(xiàng)。這很重要,它將僅保留ARGV中選項(xiàng)后提供的文件列表。