linux shell getopts

#getopts
ALL=false
HELP=false
FILE=false
VERBOSE=false
while getopts ahfvc: OPTION #将ahfvc依次传给OPTION c后面的:表示-c时需传入参数
do
case ${OPTION} in
a)
ALL=true
echo "ALL IS ${ALL}"
;;
h)
HELP=true
echo "HELP IS ${HELP}"
;;
f)
FILE=true
echo "FILE IS ${FILE}"
;;
v)
VERBOS=false
echo "VERBOSE IS ${VERBOSE}"
;;
c)
c=${OPTARG}
echo "c value is $c"
;;
\?)
echo "`basename $0` -[a h f v] -[c value] file"
;;
esac
done

参考
http://blog.sina.com.cn/s/blog_6fd335bb0100qsw2.html
while getopts ":a:bc" opt #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
getopts 有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。

--------
http://16kan.com/post/113307.html 说得更清楚
获取UNIX类型的选项:

unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式:

command -options parameters

如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。

getopts option_string variable

指定变量取值,即在option_string中将一个冒号放在选项后。但当冒号放在第一个选项时,代表其作为一个选项存在,具体含意为如果某选项设置为取值传递但却未传值时,返回该选项后的信息,若未添加此选项则默认系统也会返回一个错误信息,只是错误信息提示并不明确。

如getopts ahfvc: option表明选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。

该语句的格式为: getopts一般格式为:

getopts option_string variable

其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。

有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。

optstring option字符串,会逐个匹配

varname 每次匹配成功的选项

arg 参数列表,没写时它会取命令行参数列表

$OPTIND 特殊变量,option index,会逐个递增, 初始值为1

$OPTARG 特殊变量,option argument,不同情况下有不同的值

细则1:当optstring以”:”开头时,getopts会区分invalid option错误和miss option argument错误。

invalid option时,varname会被设成?,$OPTARG是出问题的option;

miss option argument时,varname会被设成:,$OPTARG是出问题的option。

如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使varname被设成?,$OPTARG是出问题的option。

细则2:当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中;

如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,否则varname的值是?,$OPTARG是该option。(参照细则1)

———————————————————————

2、Linux Shell 一些变量

$# 传递到脚本的参数个数

$* 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

$$ 脚本运行的当前进程I D号

$! 后台运行的最后一个进程的进程I D号

$@ 与$#相同,但是使用时加引号,并在引号中返回每个参数

$- 显示s h e l l使用的当前选项,与s e t命令功能相同

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

————

shift 用于重新分配位置参数,其实就是把向参数左移动一个位置如:$1<–$2,$2<–$3老的$1将被删除掉。

————

范例:


# cat getopts2#!/bin/sh
while getopts :ab: name
do
case $name in
a) aflag=1;;
b) bflag=1
bval=$OPTARG;;
?) echo “USAGE:`basename $0` [-a] [-b value]”
exit 1;;
esac
doneif [ ! -z $aflag ] ;
then
echo “option -a specified”
echo “$aflag”
echo “$OPTIND”
fi

if [ ! -z $bflag ] ;
then
echo “option -b specified”
echo “$bflag”
echo “$bval”
echo “$OPTIND”
fi

echo “here $OPTIND”
shift $(($OPTIND -1))
echo “$OPTIND”
echo ” `shift $(($OPTIND -1))` ”


用法例:

#!/bin/bash



if [ $# -lt 1 ]

then

echo “there is no option”;

else

while getopts “:Iti:s:v” opt;

do

case $opt in

I)echo “option is I “

;;

t)echo “option is t “

;;

i)ii=$OPTARG;echo “option is i,the value is $ii”;

;;

s)ss=$OPTARG;echo “option is s ,the value is $ss”;

;;

v)echo “option is v \n”;

;;

:)

echo “>>> Error: ‘-$OPTARG’ requires an argument”

;;

?)paralist=-1;

echo “>>> Error: ‘-$OPTARG’ not supported,please input valid argument [Itisv]“

;;

esac

done

fi



下面给出几个执行的例子:

(1)sh datediff.sh -i 1 -I -v
option is i,the value is 1
option is I
option is v \n

(2)sh datediff.sh -s -i 1
option is s, the value is -i //取s选项后的值

(3)sh datediff.sh -s //选项中有前置冒号
>>> Error: ‘-s’ requires an argument
sh datediff.sh -s //去除选项中的前置冒号后的输出
datediff.sh: option requires an argument — s
>>> Error: ‘-’ not supported,please input valid argument [Itisv]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值