2017-09-23 54 views
0

如果getopts中提供了多個選項並且一些需要參數而有些不需要參數,會怎麼樣? getopts的參數挑選下一個參數作爲參數getopts參數選擇下一個參數作爲參數

#!/bin/bash 

while getopts ":a:b:cde:f:g:" opt; do 

case $opt in 
    a) 
    echo "-a was triggered, Parameter: $OPTARG" >&2 
    ;; 
    b) 
    echo "-b was triggered, Parameter: $OPTARG" >&2 
    ;; 
    c) 
    echo "-c was triggered, Parameter: $OPTARG" >&2 
    ;; 
    d) 
    echo "-d was triggered, Parameter: $OPTARG" >&2 
    ;; 
    e) 
    echo "-e was triggered, Parameter: $OPTARG" >&2 
    ;; 
    f) 
    echo "-w was triggered, Parameter: $OPTARG" >&2 
    ;; 
    g) 
    echo "-g was triggered, Parameter: $OPTARG" >&2 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

這裏是我的問題:

$ ./hack.bash -a -b 
-a was triggered, Parameter: -b 

難道不應該顯示-a缺少一個參數,而不是採取下一個選項作爲參數。我在這裏做錯了什麼?

+4

'-b'被認爲是選項'-a'的一個參數,所以你看到的行爲是正常的。 –

回答

0

如果一個命令行選項接受一個參數,該參數必須被提供,所以它是正確的,並預期getopts "a:b"將解析-a -b作爲選項-a帶有參數-b。另外,沒有辦法提供以短劃線開頭的參數。 (請記住,和其他編程語言一樣,shell字符串只是普通字符的數組,字符在shell命令行中輸入時引用的內容不會改變字符的內部表示形式,因此-\-是沒有區別。

一些舊的命令行工具確實提供了可選的選項參數的機制。在解析參數POSIX的指導極力勸阻這種風格,但這樣做的實用程序,一般早的準則。在任何情況下,指導方針只是 - 準則,而不是規則getopts不支持這種風格的參數解析,因爲它被設計爲在準則中工作;在某種意義上,以幫助維護它們。

長選項,其參數通常與選項名稱=分開,沒有此問題; --long=-a顯然是一個值,而--long -a顯然是--long,沒有值,然後是選項-a