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]