2016-01-24 58 views
-1

我正在寫一個腳本,可以採取2-4參數:慶典 - 在非尾可選參數的位置

arg1 arg2 arg3 arg4 

arg2arg3是強制性的,將被提供,但arg1arg4是可選的。在三個參數的情況下,我如何檢查是否給出了arg4

如果參數的數量是四個,那麼這是顯而易見的;然而,與正好三個參數,我不知道它是arg1arg4是不存在的,如下面的情況:

./script arg2 arg3 arg4 
+7

不能有多個可選參數配置這樣的。想想看。無法將'arg1 arg2 arg3'與'arg2 arg3 arg4'區分開來。你可以檢查用'$#'給出的參數數量。 – e0k

+0

好吧,沒辦法*除非*有內容限制 - 例如,如果arg1總是一個數字,而arg2不能是數字,那麼可能......但是OP沒有提供足夠的信息給這裏做出這樣的區分,無論如何這是一種不必要的脆弱方法。 –

回答

1

由於e0k評論,你需要重新考慮你如何通過你的參數。對於可選的東西,你應該使用...選項。像

prog -a arg1 -b arg4 arg2 arg3 
prog -a arg1 arg2 arg3 
prog -b arg4 arg2 arg3 
prog arg2 arg3 

所以

#!/bin/bash 

arg1="default value for arg1" 
arg4="default value for arg4" 
while getopts a:b: opt; do 
    case $opt in 
     a) arg1=$OPTARG ;; 
     b) arg4=$OPTARG ;; 
    esac 
done 
shift $((OPTIND-1)) 
if [[ "$#" -ne 2 ]]; then 
    echo "ERROR: you failed to provide 2 mandatory arguments" >&2 
    exit 1 
fi 
arg2=$1 
arg3=$2 

# do stuff with "$arg1", "$arg2", "$arg3", "$arg4"