设为首页 收藏本站
查看: 970|回复: 0

shell脚本编程之getopts的使用

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-11-10 08:37:16 | 显示全部楼层 |阅读模式
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


###执行脚本时,显示的结果如下###
[iyunv@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



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-27392-1-1.html 上篇帖子: shell监控MySQL主从状态脚本两则 下篇帖子: Windows azure国际版下通过 windows auzre powershell为VM分配绑定virtual ip address
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表