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

简介:

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

在前面命令行选项的那些事中介绍了几种有"个性"的选项功能,包括:

  • 选项依赖:例如"-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;;
    esac
done

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"
目录
相关文章
|
1月前
|
存储 监控 Shell
【Shell 命令集合 磁盘管理 】Linux 关闭磁盘配额功能 quotaoff命令使用教程
【Shell 命令集合 磁盘管理 】Linux 关闭磁盘配额功能 quotaoff命令使用教程
28 1
|
1月前
|
存储 Shell Linux
【Shell 命令集合 磁盘管理 】Linux 启用指定文件系统上的磁盘配额功能 quotaon 命令使用教程
【Shell 命令集合 磁盘管理 】Linux 启用指定文件系统上的磁盘配额功能 quotaon 命令使用教程
31 1
|
9天前
|
监控 Shell 开发工具
Shell编程
Shell编程
|
24天前
|
Shell
【shell】shell命令行放在变量中执行以及变量的常用方法
【shell】shell命令行放在变量中执行以及变量的常用方法
|
28天前
|
存储 Java Shell
bigdata-04-shell编程基础
bigdata-04-shell编程基础
13 0
|
30天前
|
Shell Linux C++
【Shell 编程设计】 编写自己的清理后台的Shell脚本
【Shell 编程设计】 编写自己的清理后台的Shell脚本
31 1
|
30天前
|
存储 Shell 数据安全/隐私保护
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
【Shell 编程指南】Shell read命令 (从标准输入读取数值)
25 0
|
30天前
|
Shell C语言 C++
【Shell 编程指南】shell中的(),{}几种语法用法
【Shell 编程指南】shell中的(),{}几种语法用法
17 0
|
30天前
|
Shell 程序员 Linux
【Shell 编程指南】shell运算操作符之(())
【Shell 编程指南】shell运算操作符之(())
19 0
|
1月前
|
存储 Shell Linux
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
【Shell 命令集合 系统设置 】Linux 将参数作为命令行输入 eval命令 使用指南
25 0