我想用標準shell編寫一個工具。現在我有三種選擇來處理用戶的輸入:shell輸入參數的最佳實踐?
$ and loop
getopt
getopts
所以大一的問題是,考慮到便攜性,其中一個是我最好的做法呢?
P.S.我的工具有輸入象下面這樣:
mytool.sh [-fl] [-c|--conf file]
因此,提供了三個參數:
-f
-l
-c | --conf
我想用標準shell編寫一個工具。現在我有三種選擇來處理用戶的輸入:shell輸入參數的最佳實踐?
$ and loop
getopt
getopts
所以大一的問題是,考慮到便攜性,其中一個是我最好的做法呢?
P.S.我的工具有輸入象下面這樣:
mytool.sh [-fl] [-c|--conf file]
因此,提供了三個參數:
-f
-l
-c | --conf
getopts
不能做你想做的,因爲它不支持「長選項」像--conf
。
getopt
是可變的;有些實現支持長選項,有些則不支持。 (有些系統沒有任何實現)。所以我猜測,因爲你不需要Bash特定的解決方案,所以你也不想使用getopt
。
這樣留給你自己寫循環。 。 。這實際上很醜陋,特別是因爲你不想在循環中使用任何Bash特有的功能。
如果您僅使用便攜式結構對您很重要,我建議您不要再支持長選項--conf
,因此您可以使用getopts
。 (或者,您可以取消對合並選項符號-fl
的支持,因此編寫自定義循環會更容易,但這比使用getopts
更有用。)
我相信傳統的'getopts'(內建)與選項合併非常好,所以支持'-fl'應該不成問題。你說得對,他不得不放棄'--conf'。 –
@AaronDavies:它似乎在Bash中工作(雖然它似乎沒有記錄,但我不確定它如何記住它在合併選項中的位置),但是POSIX沒有指定它,所以我不會說'不要期望它可以在任意外殼中工作。 – ruakh
@AaronDavies:實際上,更正:看起來像POSIX *確實*說明,它說'getopts'應支持實用語法指南3-10(含)「,其中指南5是」Options without option-當分組在一個「 - 」分隔符後面時應該接受參數。「我會編輯我的答案。謝謝! – ruakh
getopt
,這裏一般意義的可執行程序發現爲/usr/bin/getopt
(與在各種shell中找到的相同名稱的內建函數相對)可能是您對shell不可知的長選項支持的最佳選擇。內置的傳統getopts
根本無法處理長期選項,並且已經實現它們的外殼已經以相互不兼容的方式完成。
您可以通過在"[email protected]"
自己循環,但使用標準工具的過程中實現完全自定義的選項處理邏輯,通常是一個更好的主意。
我認爲你的第一段使用'getopt'來表示'getopts',反之亦然。 (雖然即使在修正之後,我也不認爲它是完全正確的。) – ruakh
嗯。也許你是對的。我還在線查找'/ usr/bin/getopts'文件。不知道它有多普遍。 (我個人不是很熟悉先進的打印選項解析 - 我做了所有我最近的shell腳本在ksh93的,其具有優異的,但完全特質,長選項在它的版本內置的支持。)在任何情況下,答案編輯以反映您的評論。 –
在我上面的評論中,「打印」當然是「便攜式」的錯字。 –
您需要支持哪些平臺? Linux和OS X都有bash作爲標準;如果你需要Windows用戶使用Cygwin,他們也會有bash。我認爲其他平臺通常不值得支持。 –
僅適用於Linux,但應確保它是標準shell而不是特定於bash。我已更新問題以顯示更多詳細信息。 – harryz
所以實際上bash標籤與這個問題無關。我已經刪除它。 –