shell脚本编程之getopts的使用

getopts的使用

语法格式:getopts [option[:]] [DESCPRITION] VARIABLE

option:表示为某个脚本可以使用的选项

":":如果某个选项(option)后面出现了冒号(":"),则表示这个选项后面可以接参数(即一段描述信息DESCPRITION)

VARIABLE:表示将某个选项保存在变量VARIABLE中

 

getopts是linux系统中的一个内置变量,一般用在循环中。每当执行循环是,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,否则不是合法选项。并将这些合法选项保存在VARIABLE这个变量中。

getopts还包含两个内置变量,及OPTARG和OPTIND

OPTARG就是将选项后面的参数(或者描述信息DESCPRITION)保存在这个变量当中。

OPTIND:这个表示命令行的下一个选项或参数的索引(文件名不算选项或参数)

例如:

vim  test

#!/bin/bash
#Name:baby
#Description:
#Author:xsl
#version:0.0.1
#DateTime:11/09/14  10:25:17
#Usage:mkscript FILENAME
while getopts ':b:d:' OPT &> /dev/null;do
        case $OPT in
        b)
                echo "The options is b"
                echo $OPTARG ;;
        d)
                echo "The options is d"
                echo $OPTARG ;;
        *)
                echo "Wrong Options"
                exit 7 ;;
        esac
#       echo $OPT
#       echo $OPTARG
done
echo $OPTIND
shift $[$OPTIND-1]
echo $1

 

###执行脚本时,显示的结果如下###

[root@localhost scriptTEAM]# ./test -d 'nice' fixnale
The options is d 
nice
3
fixnale

###显示信息说明如下###

当输入-d时,$OPT=d,$OPTARG='nice',因此就会显示d)...这一部分的信息。

由于这里有一个选项(-d)和一个参数('nice'),$OPTIND指向命令行中下一个选项或参数的索引位置,因此这里即为3。

shift $[$OPTIND-1]表示将文件名前面的选项和参数踢掉

 

 

实例一:创建一个脚本文件,这个脚本文件可以用来创建其他脚本文件。

1、当创建的脚本为空时,则创建其脚本首部信息,并将光标定位在最后一行的

2、如果创建的脚本文件非空,则将光标定位于最后一行

3、检查创建脚本文件语法是否正确;如果不正确,给出提示信息“Syntax err..,Input q or Q for quitting,Input others for Editting.”。当用户输入q或Q时,则退出该脚本;如果输入其他字符,则再一次打开该脚本文件。直到输入字符符合要求即可。

4、这个脚本在执行命令过程中,如果使用的选项不符合,则给出提示信息,并退出。

vim  mkscript

#!/bin/bash
#Name: mkscript
#Description:
#Author:xsl
#version:0.0.1
#DateTime:2014-11-07  09:19:00
#Usage:mkscript FILENAME
Usage() {
        echo "mkscript [-d STRING] FILENAME."
}

 

###这一段就是用来判断给出的选项是否正确###
while getopts 'd:' OPT &> /dev/null;do
        case $OPT in
        d)
                DESC=$OPTARG ;;
        *)
                echo "Wrong Option"
                Usage
                exit 10 ;;
        esac
done
echo $OPTIND
shift $[$OPTIND-1]
echo $1

###这一段信息用来判断某个文件是否为空###

if ! grep '[^[:space:]]' $1 &> /dev/null;then
cat > $1  << EOF
#!/bin/bash
#Name:$(basename $1)
#Description:$DESC
#Author:xsl
#version:0.0.1
#DateTime:$(date '+%D  %T')
#Usage:mkscript FILENAME

EOF
vim +8 $1
else
        vim + $1
fi

###这一段用来判断创建的脚本文件语法不正确,将会执行的动作###
until  bash -n $1 &> /dev/null;do
        read -p "Syntax err..,Input q or Q for quitting,Input others for Editting.:"  SWITCH
        case $SWITCH in
        q|Q)
                echo "quitting..."
                exit 7  ;;
        *)
                vim + $1 ;;
        esac
done
chmod +x $1

 

 

实例二:写一个脚本getinterface.sh,脚本可以接受选项(i,I,a),完成如下任务:

(1)、命令使用以下形式:getinterface {-i interface | -I IP | -a }

(2)、当用户使用-i选项时,显示其指定的网卡的IP地址

(3)、当用户使用-I选项时,显示其后面的IP地址所属的网络接口

(4)、当用户单独使用-a选项时,显示所有的网络接口及其IP地址(除lo之外) 

#mkscript -d "Display interface addess" getinterface.sh

#!/bin/bash
#Name:getinterface.sh
#Description:Display interface addess
#Author:xsl
#version:0.0.1
#DateTime:11/09/14  15:13:57
#Usage:mkscript FILENAME

###使用-i选项时,显示其接口###
SHOWIP() {

##判断给出的接口是否是本地接口
 ! ifconfig | grep -o '^[^[:space:]]\{1,\}' | grep $OPTARG &> /dev/null && echo "Not localhost Interface" && return 7
 echo -n "$OPTARG "
 ifconfig $OPTARG | grep -o 'inet addr:[0-9\.]\{1,\}'  | cut -d: -f2
}

 

###使用-I选项时,显示ip所属接口###
SHOWINT() {

##判断给出的ip是否是本机ip
  ! ifconfig | grep -E -o 'inet addr:[0-9\.]+' | cut -d: -f2 | grep $OPTARG  &> /dev/null  && echo "Not localhost IP" && return  10
 echo -n "$OPTARG  "
 ifconfig | grep -B 1 "$OPTARG"| grep  -o '^[^[:space:]]\{1,\}'
}

 

###使用-a选项时,显示所有接口及其ip地址###
SHOWALL() {
 echo "Display all interfsace and ip address:"
 ifconfig -a | grep -A 1 '^[^[:space:]]\{1,\}'  | grep  -v  -E  '(\<lo\>|\b127.0.0.1\b)' | grep -E -o '^[^[:space:]]+|\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[01][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>'
}

 

###当选项错误时,显示其用法###

Usage() {
 echo "basename $0 [-i INTERFACE] [-I IP] "
}
 
while  getopts 'i:I:a'  OPT &> /dev/null;do
case $OPT in
 i)
  SHOWIP  ;;
 I)
  SHOWINT ;;
 a)
  SHOWALL ;;
 *)
  Usage ;; 
esac
done

 

 

你可能感兴趣的:(getopts,OPTIND,OPTARG)