2009-09-25 337 views
3

我正在嘗試編寫一個封裝外殼腳本,用於在每次調用命令時緩存信息。它只需要存儲第一個非選項參數。例如,在檢索第一個非選項命令行參數

$ mycommand -o option1 -f another --spec more arg1 arg2 

我想檢索「arg1」。

這怎麼能在bash中完成?

回答

6

使用getopt可能是要走的路。

如果你想看到在bash參數掃描代碼,非getopt的方法是:

realargs="[email protected]" 
while [ $# -gt 0 ]; do 
    case "$1" in 
     -x | -y | -z) 
     echo recognized one argument option $1 with arg $2 
     shift 
     ;; 
     -a | -b | -c) 
     echo recognized zero argument option $1, no extra shift 
     ;; 
     *) 
     saveme=$1 
     break 2 
     ;; 
    esac 
    shift 
done 
set -- $realargs 
echo saved word: $saveme 
echo run real command: "[email protected]" 
1

你可能想用getopt做些事情(關於如何使用,請看herehere)。

也許保存整個命令行(所以你可以把它交給真實的工具),然後用getopt處理參數,獲取你需要的信息,並啓動下層工具。

+0

你指的是Bash內置的「getopts」。但是,你放棄了「s」。沒有「s」,「getopt」的那個指的是獨立的可執行文件'/ bin/getopt',它具有相似的功能,但操作方式完全不同。 –

+0

IIRC,'getopts'不能處理長選項,但'getopt'確實。 –

+1

getopt有沒有簡單的方法來獲得arg1? – user122147

2

有沒有辦法摘下任何特定的參數,而不檢查整個命令行。原因是bash的基本假設是任何選項都可以以任何順序出現,而不考慮命令行上的相對位置。另一個前提是,在手冊頁中以短格式或長格式(即「-f」或「--file」)指定的任何選項在命令的執行中將具有有效的,可識別的用途。

最好的辦法是使用DigitalRoss提供的示例,併爲case命令的每個有效選項編寫一個case語句的值,或者只編寫您想在腳本中處理的一個或多個語句的代碼,用「*)」構造捕獲其他所有內容,如果它落入該測試則忽視它。訣竅是,如果某個特定選項有多個有效參數,則需要事先知道參數之間的區別是基於參數內容的位置還是模式匹配。對於具有多個參數的選項,您還需要使用「skip」指令來從一個參數移動到另一個參數。