2014-01-11 48 views
2

我想用標準shell編寫一個工具。現在我有三種選擇來處理用戶的輸入:shell輸入參數的最佳實踐?

$ and loop 
getopt 
getopts 

所以大一的問題是,考慮到便攜性,其中一個是我最好的做法呢?

P.S.我的工具有輸入象下面這樣:

mytool.sh [-fl] [-c|--conf file] 

因此,提供了三個參數:

  • -f
  • -l
  • -c | --conf
+0

您需要支持哪些平臺? Linux和OS X都有bash作爲標準;如果你需要Windows用戶使用Cygwin,他們也會有bash。我認爲其他平臺通常不值得支持。 –

+0

僅適用於Linux,但應確保它是標準shell而不是特定於bash。我已更新問題以顯示更多詳細信息。 – harryz

+0

所以實際上bash標籤與這個問題無關。我已經刪除它。 –

回答

1

getopts不能做你想做的,因爲它不支持「長選項」像--conf

getopt是可變的;有些實現支持長選項,有些則不支持。 (有些系統沒有任何實現)。所以我猜測,因爲你不需要Bash特定的解決方案,所以你也不想使用getopt

這樣留給你自己寫循環。 。 。這實際上很醜陋,特別是因爲你不想在循環中使用任何Bash特有的功能。

如果您僅使用便攜式結構對您很重要,我建議您不要再支持長選項--conf,因此您可以使用getopts。 (或者,您可以取消對合並選項符號-fl的支持,因此編寫自定義循環會更容易,但這比使用getopts更有用。)

+0

我相信傳統的'getopts'(內建)與選項合併非常好,所以支持'-fl'應該不成問題。你說得對,他不得不放棄'--conf'。 –

+0

@AaronDavies:它似乎在Bash中工作(雖然它似乎沒有記錄,但我不確定它如何記住它在合併選項中的位置),但是POSIX沒有指定它,所以我不會說'不要期望它可以在任意外殼中工作。 – ruakh

+0

@AaronDavies:實際上,更正:看起來像POSIX *確實*說明,它說'getopts'應支持實用語法指南3-10(含)「,其中指南5是」Options without option-當分組在一個「 - 」分隔符後面時應該接受參數。「我會編輯我的答案。謝謝! – ruakh

0

getopt,這裏一般意義的可執行程序發現爲/usr/bin/getopt(與在各種shell中找到的相同名稱的內建函數相對)可能是您對shell不可知的長選項支持的最佳選擇。內置的傳統getopts根本無法處理長期選項,並且已經實現它們的外殼已經以相互不兼容的方式完成。

您可以通過在"[email protected]"自己循環,但使用標準工具的過程中實現完全自定義的選項處理邏輯,通常是一個更好的主意。

+0

我認爲你的第一段使用'getopt'來表示'getopts',反之亦然。 (雖然即使在修正之後,我也不認爲它是完全正確的。) – ruakh

+0

嗯。也許你是對的。我還在線查找'/ usr/bin/getopts'文件。不知道它有多普遍。 (我個人不是很熟悉先進的打印選項解析 - 我做了所有我最近的shell腳本在ksh93的,其具有優異的,但完全特質,長選項在它的版本內置的支持。)在任何情況下,答案編輯以反映您的評論。 –

+0

在我上面的評論中,「打印」當然是「便攜式」的錯字。 –