shFlags简介

看到有脚本中使用了shFlags,于是google了一下,发现还是个挺方便的东西。

https://github.com/kward/shflags/wiki/Documentation12x

shaflags有助于在脚本中简单地处理命令行的参数。

如下例子

#!/bin/sh

# source shflags
. /path/to/shflags

# define a 'name' command-line string flag
DEFINE_string 'name' 'world' 'name to say hello to' 'n'

# parse the command-line
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"

# say Hello!
echo "Hello, ${FLAGS_name}!"

下面逐行分析

# source shflags
. /path/to/shflags

这个是引入了shflags,这样后面才能用。

# define a 'name' command-line string flag
DEFINE_string 'name' 'world' 'name to say hello to' 'n'

这个是定义了一个string类型的变量,名字是name,默认值是world,说明文字是name to say hello to 缩写是 n

它说明了以下两件事情

1 接受到命令行选项 -n (或者--name)的时候,将随后的参数当成一个字符串,存入变量 name 中

2 接收到命令行选项 -h (或者 --help)的时候,显示”name to say hello to“

# parse the command-line
FLAGS "$@" || exit $?
eval set -- "${FLAGS_ARGV}"

前半句FLAGS "$@" 将所有命令行参数送到shFlags库中进行处理,如果都成功,返回0(${FLAGS_TRUE})。如果返回的是1(${FLAGS_FALSE}) 或 2 (${FLAGS_ERROR}),那就执行exit $? 返回 $?

如果有shFlags不识别的命令行参数,就会被更新到现在的 $@ 变量中,可以被任何其他脚本处理。

也就是,调用脚本的时候,参数会先被shFlags处理一波,把它识别的处理完后,还会把不识别的参数放回去给别人用。

# say Hello!
echo "Hello, ${FLAGS_name}!"

这里就是输出了,使用了变量name,也就是FLAGS_name的值。

所以执行结果会是

$ ./hello_world.sh
Hello, world!

$ ./hello_world.sh -n Kate
Hello, Kate!
$ ./hello_world.sh --name 'Kate Ward'
Hello, Kate Ward!

$ ./hello_world.sh -h
USAGE: ./hello_world.sh [flags] args
flags:
  -h  show this help
  -n  name to say hello to

关于类型可以是以下几种

boolean 布尔 可使用${FLAGS_TRUE} 和${FLAGS_FALSE} 注意在shell中true是0 false是1

float 浮点 在shell中是字符串,所以在比较的时候要按字符串的规则来 也就是使用 = 和 != 而不是使用 eq, ge, gt, le, lt, ne

integer 整型 shell支持整型所以应该使用 (eq, ge, gt, ...)

string 字符串 那就是字符串

可以定义 FLAGS_HELP 提供自己的help 不然就会使用默认的help模板

本文链接:http://www.cnblogs.com/zqb-all/p/5325232.html

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【swupdate文档 二】许可证

    SWUpdate是免费软件。它的版权属于Stefano Babic和其他许多贡献代码的人(详情请参阅实际源代码和git提交信息)。 您可以根据自由软件基金会发...

    zqb_all
  • nor flash之擦除和写入

    最近研究了下nor flash的掉电问题,对nor的掉电有了更多的认识。总结分享如下

    zqb_all
  • ubuntu14.04编译gnu global 6.6.3

    打算重新折腾下环境,看中了gtags ,可参考 Vim 8 中 C/C++ 符号索引:GTags 篇 ,先记录下编译过程

    zqb_all
  • Vimscript 中的坑

    本文内容为学习 「笨方法学 Vimscript」 过程中,觉得 Vimscript 语法中与所掌握的其它语言的定义有明显区别,需要特别记忆的内容。

    mzlogin
  • matlab面向对象编程基础

    www.cnblogs.com/hdu-zsk: https://www.cnblogs.com/hdu-zsk/p/5787150.html

    DrawSky
  • jquery基础教程之ajax数据交互

    老雷PHP全栈开发
  • mysql常用配置注意项与sql优化

    肖哥哥
  • Ngrok编译Windows下客户端和相关配置

    上一篇文章实现了Ngrok在Ubuntu服务端和Ubuntu的内网穿透代理到外网,那么基于现有的ubuntu服务端,如何让运行在win下的web服务或其他服务...

    李郑
  • 使用 kubeadm 安装单 master kubernetes 集群

    对于 Kubernetes 初学者,在搭建 K8S 集群时,推荐在阿里云或腾讯云采购如下配置:(也可以使用自己的虚拟机、私有云等最容易获得的 Linux 环境)

    高楼Zee
  • java开发中spring和springboot常用注解总结,开发人员必学

    这个注解可以用于类和方法上,用于类上,表示父路径,如类上是demo,方法上是/demo1,那么访问路径就是demo/demo1

    用户1289394

扫码关注云+社区

领取腾讯云代金券