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将被删除掉。

————

范例:


[root@localhost ~]# 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]

你可能感兴趣的:(linux,shell)