当前位置: > shell编程 >

使用getopt处理shell脚本的参数实例学习

时间:2014-09-08 23:03来源:linux.it.net.cn 作者:it

getopt命令并非bash的内建命令,它是由util-linux包提供的外部命令。
相比较bash 的内置命令,getopt不只支持短参-s,还支持--longopt的长参数,甚至支持-longopt的简化参数。getopt可以用于tcsh其它的shell。

我们就以系统自带的帮助文件,说说getopt在bash下的使用技巧。
 

复制代码代码如下:
#!/bin/bash  
 
# A small example program for using the new getopt(1) program.  
# This program will only work with bash(1)  
# An similar program using the tcsh(1) script language can be found  
# as parse.tcsh  
 
# Example input and output (from the bash prompt):  
# ./parse.bash -a par1 'another arg' --c-long 'wow!*\?' -cmore -b " very long "  
# Option a  
# Option c, no argument  
# Option c, argument `more'  
# Option b, argument ` very long '  
# Remaining arguments:  
# --> `par1'  
# --> `another arg'  
# --> `wow!*\?'  
 
# Note that we use `"$@"' to let each command-line parameter expand to a   
# separate word. The quotes around `$@' are essential!  
# We need TEMP as the `eval set --' would nuke the return value of getopt.  
TEMP=`getopt -o ab:c:: --long a-long,b-long:,c-long:: \  
 -n 'example.bash' -- "$@"`  
 
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi  
 
# Note the quotes around `$TEMP': they are essential!  
eval set -- "$TEMP" 
 
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 has an optional argument. As we are in quoted mode,  
# an empty parameter will be generated if its optional  
# argument is not found.  
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

 getopt 命令的选项说明:

-a 使getopt长参数支持"-"符号打头,必须与-l同时使用
-l 后面接getopt支持长参数列表
-n program如果getopt处理参数返回错误,会指出是谁处理的这个错误,这个在调用多个脚本时,很有用
-o 后面接短参数列表,这种用法与getopts类似
-u 不给参数列表加引号,默认是加引号的(不使用-u选项),例如在加不引号的时候 --longopt "select * from db1.table1" $2只会取到select ,而不是完整的SQL语句。

使用eval 的目的是为了防止参数中有shell命令,被错误的扩展。
实际官方提供的这个语法也不是很简洁,下面提供一个我平时用到的:
 

复制代码代码如下:
ARGS=`getopt -a -o I:D:T:e:k:LMSsth -l instence:,database:,table:,excute:,key:,list,master,slave,status,tableview,help -- "$@"`  
[ $? -ne 0 ] && usage  
#set -- "${ARGS}"  
eval set -- "${ARGS}" 
 
while true  
do  
case "$1" in 
-I|--instence)  
instence="$2" 
shift  
;;  
-D|--database)  
database="$2" 
shift  
;;  
-T|--table)  
table="$2" 
shift  
;;  
-e|--excute)  
excute="yes" 
shift  
;;  
-k|--key)  
key="$2" 
shift  
;;  
-L|--list)  
LIST="yes" 
;;  
-M|--master)  
MASTER="yes" 
;;  
-S|--slave)  
SLAVE="yes" 
;;  
-A|--alldb)  
ALLDB="yes" 
;;  
-s|--status)  
STATUS="yes" 
;;  
-t|--tableview)  
TABLEVIEW="yes" 
;;  
-h|--help)  
usage  
;;  
--)  
shift  
break 
;;  
esac  
shift  
done
 

重点关注:esac和done中的shift,还有符号“--”条件下的shift;break操作。

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容