在 getopts 之后解析参数
Posted
技术标签:
【中文标题】在 getopts 之后解析参数【英文标题】:parse arguments after getopts 【发布时间】:2012-03-17 09:20:50 【问题描述】:我想调用这样的 bash 脚本
$ ./scriptName -o -p -t something path/to/file
据我所知
#!/bin/bash
o=false
p=false
while getopts ":opt:" options
do
case $options in
o ) opt1=true
;;
p ) opt2=true
;;
t ) opt3=$OPTARG
;;
esac
done
但是我如何获得path/to/file
?
【问题讨论】:
【参考方案1】:你可以这样做:
shift $(($OPTIND - 1))
first_arg=$1
second_arg=$2
循环运行后。
【讨论】:
第一行可以写成shift $((OPTIND - 1))
- 即在括号内去掉美元符号吗?
Armand,所以看起来像:tldp.org/LDP/abs/html/arithexp.html【参考方案2】:
要捕获getopts
处理后的所有剩余参数,一个好的解决方案是shift
(删除)所有处理过的参数(变量$OPTIND
)并将剩余的参数($@
)分配给特定的多变的。
简短回答:
shift $(($OPTIND - 1))
remaining_args="$@"
长示例:
#!/bin/bash
verbose=false
function usage ()
cat <<EOUSAGE
$(basename $0) hvr:e:
show usage
EOUSAGE
while getopts :hvr:e: opt
do
case $opt in
v)
verbose=true
;;
e)
option_e="$OPTARG"
;;
r)
option_r="$option_r $OPTARG"
;;
h)
usage
exit 1
;;
*)
echo "Invalid option: -$OPTARG" >&2
usage
exit 2
;;
esac
done
echo "Verbose is $verbose"
echo "option_e is \"$option_e\""
echo "option_r is \"$option_r\""
echo "\$@ pre shift is \"$@\""
shift $((OPTIND - 1))
echo "\$@ post shift is \"$@\""
这将输出
$ ./test-getopts.sh -r foo1 -v -e bla -r foo2 remain1 remain2
Verbose is true
option_e is "bla"
option_r is " foo1 foo2"
$@ pre shift is "-r foo1 -v -e bla -r foo2 remain1 remain2"
$@ post shift is "remain1 remain2"
【讨论】:
以上是关于在 getopts 之后解析参数的主要内容,如果未能解决你的问题,请参考以下文章