2014-10-07 40 views
1

我有一個腳本:缺少的參數設置參數下一個選項

#!/bin/bash 

i_flag=false 
v_flag=false 

while getopts ":i:v:" opt; do 
    case $opt in 
    i ) i_flag=true; echo $OPTARG;; 
    v ) v_flag=true; echo $OPTARG;; 
    \?) echo Unknown option: -$OPTARG >&2; exit 1;; 
    : ) echo "Missing option argument for -OPTARG" >&2; exit 1;; 
    esac 
done 

echo $i_flag 
echo $v_flag 

當我運行此不設置任何選項,我得到:

# ./opts_script.sh -i -v 
-v 
true 
false 

什麼我希望看到的是兩個選項的輸出都表明沒有參數已被傳遞。但是,-i選項的參數爲-v,並將i_flag變量設置爲true。然後它將v_flag變量設置爲false,因爲它沒有將其視爲選項。

我也使用了while getopts ":iv:" opts; do,因此-i選項不會將下一個選項作爲其參數。然而,這是不受歡迎的,因爲它允許選項被取消設置;不是我想要的。

因此,我的問題是:是否可以確保所有提供的選項都有參數,並且如果沒有提供參數,那些參數不是下一個選項?如果是這樣,怎麼樣?

回答

0

這是問題,因爲getopt也接受連接參數,例如,以下

getopts ":i:v:xyz" 

將接受

getopts -xyz 

$opt將sequentally設置爲xyz。還接受過下面的參數需要值 - 就像你-i

script -iwww 

例如不需要空間 - $OPTARG將被設置爲www。因此,以下爲過接受

script -xyiwww 

什麼套,xyi$OPTARG = www

而且由於上述情況,getopts的便無法區分:

script -iwww #sets to the `$OPTARG` the string `www` 
#and 
script -iv  #set to the `$OPTARG` the string `v` altough the `-v` is an possible argument. 

一段時間的努力,可以做分離的論點一些檢查,如

scrit -i -v 

究竟會拋出錯誤,如果$OPTARG(在這種情況下爲-v)以-開頭,但是這並不能解決上述「加入」參數的問題...

因爲我的英語不是最好的之一,我希望以上有意義......

0

如果你想讓你的輸入是什麼「-v」是有效的輸入。我建議你做輸入驗證,因爲你的輸入有一些要求。你可以做一些討厭/聰明的輸入驗證檢查參數是否看起來像一個選項標誌,但通常最好檢查輸入是否遵循預期的模式或給定的文件存在等。