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