在编写shell脚本中,需要输入参数,使用过程中,getopts更加方便。可以很好的处理用户输入的参数和参数值。
参加如下一段脚本:
#!/bin/bash while getopts ":a:p:c:e" opt do case $opt in a) echo "--- -a ---" echo $OPTARG;; p) echo "--- -p ---" echo $OPTARG;; c) echo "--- -c ---" echo $OPTARG;; e) echo "--- -e ---"
echo $OPTARG;; ?) echo "-a -p -c -e" exit 1;; esac done
OPTIND:getopts使用OPTIND作为索引,来处理下一个需要处理的参数,记录当前的状态。
OPTARG:在上面的循环中,a,p,c三个参数后面各有一个冒号,冒号表示该输入的参数后面还有一个参数值,当getopts发现冒号后,会处理用户输入的参数值,这个参数值被保存在OPTARG中。
OPTSTRING:也就是上例中的 :a:p:c:e,getopts需要处理的参数。注意,最前面的冒号“:”用于指定getopts工作于silent mode,在silent模式下,当用户输入的参数不满足OPTSTRING时,不会讲illegal option这样的错误信息打印出来,使代码看起来更加专业。如果想要工作在verbose模式下,可以去掉最前面的冒号。
OPTSTRING后面没有冒号,则可以输入参数也可以不输入参数,但是如果输入参数,OPTARG也不会保存参数的值。
如上脚本执行结果如下:
linux-UMLhEm:/home/test/shell # ./option.sh -e --- -e --- linux-UMLhEm:/home/test/shell # ./option.sh -e abc --- -e --- linux-UMLhEm:/home/test/shell # ./option.sh -a test -p ok --- -a --- test --- -p --- ok linux-UMLhEm:/home/test/shell # ./option.sh -a test -p --- -a --- test -a -p -c -e linux-UMLhEm:/home/test/shell # ./option.sh -a -a -p -c -e linux-UMLhEm:/home/test/shell #
如果在OPTSTRING中在字母前不加“:”改为
while getopts "a:p:c:e" opt
则,执行结果为:
linux-UMLhEm:/home/test/shell # ./option.sh -a
./option.sh: option requires an argument -- a
-a -p -c -e
linux-UMLhEm:/home/test/shell # ./option.sh -a test -p ok
--- -a ---
test
--- -p ---
ok
linux-UMLhEm:/home/test/shell # ./option.sh -a test -p
--- -a ---
test
./option.sh: option requires an argument -- p
-a -p -c -e