博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shell编程——如何实现命令行选项的各种个性功能
阅读量:7113 次
发布时间:2019-06-28

本文共 1299 字,大约阅读时间需要 4 分钟。

如何实现命令行选项的各种个性功能

在前面中介绍了几种有"个性"的选项功能,包括:

  • 选项依赖:例如"-a"或"--add"要依赖于"-m"或"--manage"选项
  • 选项互斥:例如"-a"或"--add"与"-r"或"--remove"是互斥的
  • 识别负数参数:例如-w -5 -3 5,其中-5和-3不是短选项,而是负数参数
  • 模式化选项:例如script_name MODE OPTIONS的MODE部分,可以是manage模式(--manage,-m),也可以使用add模式(--add,-a)
  • 选项参数替代选项:例如head -n 3可以替换为head -3

这里介绍下用getopt解析参数后实现它们的思路。

在getopt解析完成后,假设返回结果保存到了$parameters变量中。

1.选项依赖性

这个其实很好实现,只需使用grep对$parameters变量进行筛选一下即可。

例如实现依赖性,只需:

{ echo "$parameters" | grep -E '\-\-add|\-a ' | grep -E '\-\-manage|\-m '; } &>/dev/null[ $? -ne 0 ] && exit

2.选项互斥性

要实现互斥性,只需:

or_op=`echo "$parameters" | grep -Eo '\-\-add|\-a | \-\-remove|\-r ' | wc -l`[ "$or_op" = "2" ] && exit

3.识别负数参数

前面解释过,getopt提供了两种扫描模式,只要使用+扫描模式,就能轻松区别负数参数和短选项。

4.模式化选项

一般来说,模式化选项都是命令行的第一个参数。所以,只需将$parameter中"--"后面的第一个非选项类型的参数提取出来,就是所谓的模式了。当然,还得对这个参数进行一些判断,避免它不是模式参数。

例如,要提供addr、show、route三种模式,那么其它的非选项类型参数值都不应该是模式参数。

eval set -- "$parameters"while true ; do    case "$1" in            ...        --)             shift            [ "$x" = "addr" -o "$x" = "route" -o "$x" = "show" ] && MODE=$1            shift            break ;;        *) echo "wrong";exit 1;;    esacdone

5.选项参数替代选项

就以-n3-3为例,它的通用格式是-n NUM-NUM。这个并不好实现,我能想到的方法是将这个-NUM先从$@中筛选出来,然后赋值。

NUM=`echo "$@" | grep -Eo "\-[0-9]+"`ARGS=`echo "$@" | sed -nr 's!(.*)-[0-9]+(.*)!\1\2!'p`eval set -- "$ARGS"

转载地址:http://hvwel.baihongyu.com/

你可能感兴趣的文章
Ubuntu 实用包安装指令
查看>>
tomcat启动慢
查看>>
XML之JDOM解析
查看>>
YXcms第一届模板大赛开始咯
查看>>
maven 命令手动添加本地jar包
查看>>
为什么我不同意建房子
查看>>
授之以渔-运维平台Saltstack Web 管理一(Returnner篇)
查看>>
PHP操作XML(二)——单词翻译功能
查看>>
Android系统的智能指针(轻量级指针、强指针和弱指针)的实现原理分析(5)...
查看>>
Struts2、Spring和Hibernate应用实例
查看>>
计算webView的高度
查看>>
把常见的编码类型文件(ASCI、Unicode、utf-8)读出到std::string中
查看>>
用vs2013编译gtest出现无法找到windows.h解决方法
查看>>
SCOM的基本概念的理解&警报的处理
查看>>
我的友情链接
查看>>
Windows 2012 - Dynamic Access Control 浅析
查看>>
Powershell 比较AD和Exchange的用户登录时间
查看>>
linux系统组成之小型RedHat little linux制作四
查看>>
我的友情链接
查看>>
How to Calculate Network and Broadcast Address
查看>>