Nov 6

[原]使用getopt传递脚本选项参数 不指定

linuxing , 16:57 , 编程 » Bash , 评论(3) , 引用(0) , 阅读(37604) , Via 本站原创 | |
   bash环境下,以“-”或“--”开头的参数称选项参数。可以使用bash内置命令getopts或外部命令getopt进行传递。getopts的时候可参考《》,以下用getopt的范例进行说明。
一、获取范例
getopt官网:点击
范例下载:

二、前提
1、先确定是否增强版的getopt
引用
# getopt -T
# echo $?
4
# getopt -V
getopt (enhanced) 1.1.3

返回结果为4,则为增强版的getopt,否则为旧版本。
2、命令参数
getopt可以为bash提供短选项和长选项的参数引用:
引用
-o 短选项
-l 长选项
-n 脚本命令,若传递参数报错,会报该名字

选项的使用定义规则类似:
引用
ab:c::

意思是:
引用
a 后没有冒号,表示没有可以参数
b 后跟一个冒号,表示有一个必要的参数
c 后跟两个冒号,表示有一个可选的参数
长选项的定义相同,但用逗号分割。


三、示例脚本
截取主要部分:
引用

# 请注意定义方法,以及使用"$@"从bash获取参数,不能使用$*代替,“"”号也不能缺少
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \
    -n 'example.bash' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# 使用eval set分配位置参数,$TEMP必须使用“"”号括住
eval set -- "$TEMP"

#请留意shift需根据是否可接受参数而移动
while true ; do
 case "$1" in
   -a|--a-long) echo "Option a" ; shift ;;
   -b|--b-long) echo "Option b, argument \`$2'" ; shift 2 ;;
   -c|--c-long)
     # c 选项带一个可选的参数,若没有指定则为空,请留意后面给予选项参数的写法
     case "$2" in
     "") echo "Option c, no argument"; shift 2 ;;
     *)  echo "Option c, argument \`$2'" ; shift 2 ;;
     esac ;;
     --) shift ; break ;;
     *) echo "Internal error!" ; exit 1 ;;
     esac
done
#显示除选项参数外的参数
echo "Remaining arguments:"
for arg do echo '--> '"\`$arg'" ; done


四、使用
1、第一次
引用
# sh getopt-parse.bash -a "arg1 arg2"
Option a
Remaining arguments:
--> `arg1 arg2'

可以看到,-a后不能接受选项参数,其会作为普通参数存在。
2、第二次
引用
# sh getopt-parse.bash -b "arg4"
Option b, argument `arg4'
Remaining arguments:

-b选项可以接受参数。再试试这个:
引用
# sh getopt-parse.bash -b
example.bash:选项需要一个参数 -- b
Remaining arguments:

-b后面跟的是必要参数哦,不能忽略。
3、第三次
引用
# sh getopt-parse.bash -c "arg3"
Option c, no argument
Remaining arguments:
--> `arg3'

奇怪,-c后已经跟有选项参数,但并没有识别到?再试试:
引用
# sh getopt-parse.bash -c"arg3"
Option c, argument `arg3'
Remaining arguments:

原来如此,-c和选项参数之间不能有空格。
4、全部一起
引用
# sh getopt-parse.bash -a "arg1 arg2" -c"arg3" -b "arg4" "arg5"
Option a
Option c, argument `arg3'
Option b, argument `arg4'
Remaining arguments:
--> `arg1 arg2'
--> `arg5'

请注意区分选项参数和普通参数。

五、遗留问题
   长选项使用可选参数会报错,可见:
引用
# sh getopt-parse.bash -c"more"
Option c, argument `more'
Remaining arguments:
# sh getopt-parse.bash --c-long"more"
example.bash:无法识别的选项“--c-longmore”
Remaining arguments:
# sh getopt-parse.bash --c-long "more"
Option c, no argument
Remaining arguments:
--> `more'

暂时没有找到解决的方法。
Tags:
wuha
2009/04/29 10:43
感谢楼主和dangbinghoo 君,在下受益颇多grin
linuxing 回复于 2009/04/29 12:03
^_^
dangbinghoo
2008/08/30 16:26
不知兄弟使用何种unix系统,不过在GNU系统中,尤其是大部分的应用程序源码的目录里configure脚本都是使用这种啊, 比如 ./configure --prefix=/usr --disable-nls      ........等等,这两天写脚本就像实现些长选项,但是发现号称遵循POSIX标准的getopts不支持长选项,所以就看getopt的示例,搜到你这里了,顺便说说,呵呵.
linuxing 回复于 2008/08/31 17:36
非常感谢!我是习惯了按短选项的方式来赋予参数,即用空格分开。但对于长选项,确实如您所说的,应该用等号赋值。
dangbinghoo
2008/08/28 18:33
长选项的使用应该是这样:
sh getopt-parse.bash --c-long=more 就可以了,短选项使用-c=more也可以
linuxing 回复于 2008/08/29 22:14
谢谢了,只是这样的方式和平时使用参数的习惯有点不同咯。^-^
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]