2011-09-23 18 views
8

例子:在bash中,我怎樣才能以任意順序擁有一組參數?像鍵值對一樣?

./myscript --ip 192.168.1.1 --port 1985 

或其他可能

./myscript --port 1985 --ip 192.168.1.1 

我希望讓我的腳本拍攝一組參數,以任意順序

./myscript a b c d 
./myscript d c b a 
./myscript b d a c 

Etcetera

+0

通常情況下,IP和端口的一個參數指定:'192.168.1.1:1985' – mouviciel

+0

@mouviciel我會同意,但是這僅僅是用於演示目的 – stackoverflow

回答

10

看看getopts

getopts的:getopts的optstring名稱[參數]
解析選項參數。

Getopts被shell程序用來解析位置參數 作爲選項。

OPTSTRING包含要識別的選項字母;如果一個字母 後跟一個冒號,則該選項預計會有一個參數 ,該參數應該用空格分隔。

每次被調用時,getopts的將放置在 shell變量$名稱下一個選項,初始化名稱,如果不存在的話,和 下一個參數的索引被加工成殼 變量OPTIND。每次調用shell腳本時,OPTIND都會初始化爲1。當選項需要參數時, getopts將該參數放入shell變量OPTARG

getopts以兩種方式之一報告錯誤。如果OPTSTRING的第一個字符 是冒號,getopts將使用靜默錯誤報告。在 此模式下,不會打印錯誤消息。如果看到一個無效選項 ,getopts會將找到的選項字符放入OPTARG中。如果未找到 所需的參數,getopts會將''放入NAME,並且 會將OPTARG設置爲找到的選項字符。如果getopts不在 靜默模式下,並且看到一個無效的選項,getopts會放置'?'到 NAME並取消OPTARG。如果找不到必需的參數,則'' 被置於NAME中,OPTARG未被設置,並且打印出診斷消息 。

如果殼可變OPTERR的值爲0,getopts的禁止錯誤消息的 印刷,即使 OPTSTRING的第一個字符不是冒號。 OPTERR默認值爲1。

Getopts通常會分析位置參數($ 0 - $ 9),但如果給出更多參數 ,則會分析它們。

退出狀態
如果找到選項,返回成功;如果遇到選項結尾 或發生錯誤,則失敗。

3

這個簡單的腳本需要端口號p和IP地址i參數。

 
while getopts "i:p:" option; do 
    case $option in 
    i) ip_address=$OPTARG 
    echo "ip address: $ip_address" 
    ;; 
    p) port_number=$OPTARG 
    echo "port number: $port_number" 
    ;; 
    esac 
done 

可以以兩種方式執行:

./myscript -i 192.168.1.1 -p 1985

./myscript -p 1985 -i 192.168.1.1

執行時它打印:

 
ip address: 192.168.1.1 
port number: 1985 

也是截至http://wiki.bash-hackers.org/howto/getopts_tutorial

注意提到,getopts的是不能夠解析GNU風格的長選項(--myoption)或XF86風格的長選項(-myoption)

,所以你不能使用長字符串--port--ip直接與getopts。在這裏的鏈接中提供 但是另外的解決方法:
http://www.bahmanm.com/blogs/command-line-options-how-to-parse-in-bash-using-getopt

相關問題