shell脚本中用getopts处理用户输入选项和参数,举例说明使用方法:
while getopts :a:b:cdefg opt; do
case $opts in
a) do sth;;
cde) do another;;
?)exit;;
esac
done
几个重要变量:
OPTSTRING 也就是上例中的 :a:b:cdefg,getopts需要处理的参数。注意,最前面的冒号“:”用于指定getopts工作于silent mode,在silent模式下,当用户输入的参数不满足OPTSTRING时,不会讲illegal option这样的错误信息打印出来,使代码看起来更加专业。如果想要工作在verbose模式下,可以去掉最前面的冒号.
varname 每次匹配成功的选项
arg 参数列表,没写时它会取命令行参数列表
$OPTIND 特殊变量,option index,会逐个递增, 初始值为1;getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态。
$OPTARG 特殊变量,option argument,不同情况下有不同的值;参数后面若有一个冒号,表示该输入的选项后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。
默认情况下上面的函数第一次执行完成后,下一次在执行时,会跳过while循环,因为OPTIND不会重新产生,他被作为一个global variable使用,所以getopts在调用时,他的索引作为共享资源会变得混乱。在脚本中每次执行时,都会调用一个新的shell,所以OPTIND会被设置为1。如果想要他每次都能重新被调用,必须要在调用getopts前面某一行加上local OPTIND,生命OPTIND为局部变量,这样当调用完getopts后OPTIND就被释放,下次调用时又重新生成新的OPTIND并重新执行getopts函数。
-------------------------------------------------------
function hello(){
##local OPTIND ##OPTIND默认为全局变量
while getopts :a: opt; do
case $opts in
a) echo "OPTARG";;
?)exit;;
esac
done
}
#调用
hello -a nihaoma
hello -a wohenhao
-------------------------------------------------------
==结果==============================
nihaoma
nihaoma
====================================
-------------------------------------------------------
function hello(){
local OPTIND ##声明OPTIND为局部变量
while getopts :a: opt; do
case $opts in
a) echo "OPTARG";;
?)exit;;
esac
done
}
#调用
hello -a nihaoma
hello -a wohenhao
-------------------------------------------------------
==结果==============================
nihaoma
wohenhao
====================================