我希望能够将输入解析为类似于以下内容的bash shell脚本。
myscript.sh --casename obstacle1 --output en --variables v P pResidualTT
我到目前为止最好的失败是因为最后一个参数有多个值。第一个参数应该只有1个值,但第三个参数可以有大于1的值。有没有办法在第三个参数之后指定所有内容直到下一组" - "应该抓住?我将假设用户不会按照我所显示的顺序给出参数。
casename=notset
variables=notset
output_format=notset
while [[ $# -gt 1 ]]
do
key="$1"
case $key in
--casename)
casename=$2
shift
;;
--output)
output_format=$2
shift
;;
--variables)
variables="$2"
shift
;;
*)
echo configure option \'$1\' not understood!
echo use ./configure --help to see correct usage!
exit -1
break
;;
esac
shift
done
echo $casename
echo $output_format
echo $variables
答案 0 :(得分:4)
一种常规做法(,如果你将要这样做)是关闭多个参数。那就是:
variables=( )
case $key in
--variables)
while (( "$#" >= 2 )) && ! [[ $2 = --* ]]; do
variables+=( "$2" )
shift
done
;;
esac
也就是说,构建调用约定更常见,因此调用者会在每个后续变量中传递一个-V
或--variable
参数 - 例如:
myscript --casename obstacle1 --output en -V=v -V=p -V=pResidualTT
...在这种情况下你只需要:
case $key in
-V=|--variable=) variables+=( "${1#*=}" );;
-V|--variable) variables+=( "$2" ); shift;;
esac