linux shell getopts

#getopts

ALL=false

HELP=false

FILE=false

VERBOSE=false

whilegetoptsahfvc:OPTION#将ahfvc依次传给OPTIONc后面的:表示-c时需传入参数

do

case${OPTION}in

a)

ALL=true

echo"ALLIS${ALL}"

;;

h)

HELP=true

echo"HELPIS${HELP}"

;;

f)

FILE=true

echo"FILEIS${FILE}"

;;

v)

VERBOS=false

echo"VERBOSEIS${VERBOSE}"

;;

c)

c=${OPTARG}

echo"cvalueis$c"

;;

\?)

echo"`basename$0`-[ahfv]-[cvalue]file"

;;

esac

done

参考

http://blog.sina.com.cn/s/blog_6fd335bb0100qsw2.html

whilegetopts":a:bc"opt#第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数

getopts有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。

--------

http://16kan.com/post/113307.html说得更清楚

获取UNIX类型的选项:

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

command-optionsparameters

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

getoptsoption_stringvariable

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

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

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

getoptsoption_stringvariable

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

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

optstringoption字符串,会逐个匹配

varname每次匹配成功的选项

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

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

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

细则1:当optstring以”:”开头时,getopts会区分invalidoption错误和missoptionargument错误。

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

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

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

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

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

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

2、LinuxShell一些变量

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

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

$$脚本运行的当前进程ID号

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

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

$-显示shell使用的当前选项,与set命令功能相同

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

————

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

————

范例:

[root@localhost~]#catgetopts2#!/bin/sh

whilegetopts:ab:name

do

case$namein

a)aflag=1;;

b)bflag=1

bval=$OPTARG;;

?)echo“USAGE:`basename$0`[-a][-bvalue]”

exit1;;

esac

doneif[!-z$aflag];

then

echo“option-aspecified”

echo“$aflag”

echo“$OPTIND”

fi

if[!-z$bflag];

then

echo“option-bspecified”

echo“$bflag”

echo“$bval”

echo“$OPTIND”

fi

echo“here$OPTIND”

shift$(($OPTIND-1))

echo“$OPTIND”

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

用法例:

#!/bin/bash

if[$#-lt1]

then

echo“thereisnooption”;

else

whilegetopts“:Iti:s:v”opt;

do

case$optin

I)echo“optionisI“

;;

t)echo“optionist“

;;

i)ii=$OPTARG;echo“optionisi,thevalueis$ii”;

;;

s)ss=$OPTARG;echo“optioniss,thevalueis$ss”;

;;

v)echo“optionisv\n”;

;;

echo“>>>Error:‘-$OPTARG’requiresanargument”

;;

?)paralist=-1;

echo“>>>Error:‘-$OPTARG’notsupported,pleaseinputvalidargument[Itisv]“

;;

esac

done

fi

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

(1)shdatediff.sh-i1-I-v

optionisi,thevalueis1

optionisI

optionisv\n

(2)shdatediff.sh-s-i1

optioniss,thevalueis-i//取s选项后的值

(3)shdatediff.sh-s//选项中有前置冒号

>>>Error:‘-s’requiresanargument

shdatediff.sh-s//去除选项中的前置冒号后的输出

datediff.sh:optionrequiresanargument—s

>>>Error:‘-’notsupported,pleaseinputvalidargument[Itisv]