日期:2014-05-16  浏览次数:20626 次

Linux getopts&shift命令浅析

??? 在Shell命令/函数中? shift常用来获取参数值(可以突破Linux 参数值只能传入$1-$9的限制),而getopts可用来获取选项参数

? ?? 对于shift,例如:

?

#!/bin/bash
usage()
{
  echo "usage:`basename $0` -[l|u] file [files]" >&2
  exit 1 
}   
if [ $# -eq 1 ]; then
    usage
fi
opt=""
while [ $# -ne 1 ] 
do
   opt=$1;
   case $opt in 
      -l|-L) echo "-l or -L options is specified"
             shift
             ;;
      -u|-U) echo "-u or -U options is specified"
              shift
             ;;
      *)  usage
             ;;
   esac
done
?

???? 上面这个脚本试图去获取参数-l或者-u (显然以后的getopts更强大),如果没有满足条件的参数,则调用usage函数,输出错误提示信息。

???? 所以在运行上述脚本的时候,会出现以下几种情况:

?

?

[chenwu@localhost unit20-arguments]$ ./shift.sh 
usage:shift.sh -[l|u] file [files]
[chenwu@localhost unit20-arguments]$ ./shift.sh -l 3
-l or -L options is specified

?

???? 同时shift还可以指定移动的位数 ,例如常见的获取参数的最后一项的方法是:

?

shift `expr $# - 1`
echo $1
//将输出最后一个参数的内容
?

?

?? 对于getopts,例如对于一个命令 常见形式command -[很多选项]? file

??? 如何获取那里面的每个选项,并且规定有些选项必须指定的呢?这些都需要依靠getopts命令来完成。

??? 常见的应用形式:getopts? options_string option(这里的option表示把刚才读取的选项值存放到option中)

??? 例如: 下面一个例子用于获取脚本的afgh等参数,并提示一些信息

?

#!/bin/bash
ALL=false
HELP=false
FILE=false
VERBOSE=false
CHAR=false
while getopts :ahfgc: OPTION
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"
         ;;
   c)    VERBOSE=true
         CHAR=$OPTARG
         echo "CHAR is $CHAR"
         ;;
   \?)   echo "`basename $0 ` needs -[a|h|f] -c[args] file"
         ;;
   esac
done

?

??? 注意这个脚本里的:afghc:? 的冒号? 前面的冒号表示屏蔽脚本的系统提示错误,转而使用自己提供的错误提示方式。后面的冒号表示c这个选项为必选项,并且需要指定具体的参数值,同时需要获取到参数值后将参数值存放到变量OPTARG中,供以后读取用。

??? \??? ?表示捕捉任意单字符,这里捕捉错误,并打印相应信息。 basename $0 表示提取脚本的名称 (例如basename ./test.sh 将将输出test.sh)

?? 在运行这个脚本的时候,有以下几种情况:

?

?

[chenwu@localhost unit20-arguments]$ ./getopts.sh -ah -c 3
ALL is true
HELP is true
CHAR is 3

[chenwu@localhost unit20-arguments]$ ./getopts.sh -ah -c
ALL is true
HELP is true