2016-01-24 55 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"