https://www.cnblogs.com/yeungchie/

可以用 getopt,但我还是喜欢自己写这个过程,便于我够控制更多细节。

下面要实现的效果是,从命令行参数中分析,给 $libName$cellName$viewName 三个变量赋值,

  • 分别通过选项: --lib--cell--view 来定义
  • 同时也可以支持短选项:-l-c-v 来定义
  • 如果存在没有定义的参数,则 $ib$cell 使用默认值 undef$view 默认值 layout
  • -h 或者 --help 可以打印帮助内容

code

#!/bin/bash
#--------------------------
# Program : getOptTemplate.sh
# Language : Bash
# Author : YEUNGCHIE
# Version : 2022.03.19
#--------------------------
function help {
# 定义一个函数, 写 help 信息
cat <<EOF
Usage:
-l, --lib Library Name
-c, --cell Cell Name
-v, --view View Name
EOF
} # 这里开始分析输入参数
while [[ -n $1 ]]; do
if [[ -n $optType ]]; then
case $optType in
# 根据 optType 来决定给什么变量赋值
lib_opt) libName=$1 ;;
cell_opt) cellName=$1 ;;
view_opt) viewName=$1 ;;
esac
# 赋值完了把 optType 复原
unset optType
else
case $1 in
# -短选项|--长选项) optType='起个名字' ;;
-l|--lib) optType='lib_opt' ;;
-c|--cell) optType='cell_opt' ;;
-v|--view) optType='view_opt' ;;
-h|--help)
# 打印 help 后退出
help >&2
exit 1
;;
*)
# 报错提示, 未知的 option
echo "Invalid option - '$1'" >&2
echo "Try -h or --help for more infomation." >&2
exit 1
;;
esac
fi
# 把命令行接受的参数列表的元素往前移一位
shift
done
# 分析结束 if [[ ! -n $libName ]]; then libName=undef ; fi
if [[ ! -n $cellName ]]; then cellName=undef ; fi
if [[ ! -n $viewName ]]; then viewName=layout; fi cat <<EOF
Input arguments:
Library Name --> $libName
Cell Name --> $cellName
View Name --> $viewName
EOF exit 0

演示

  • 未定义参数的默认值

    $ ./getOptTemplate.sh
    Input arguments:
    Library Name --> undef
    Cell Name --> undef
    View Name --> layout
  • 长选项和短选项

    $ ./getOptTemplate.sh --lib OC1231 -c demo -v schematic
    Input arguments:
    Library Name --> OC1231
    Cell Name --> demo
    View Name --> schematic
  • 错误参数名的报错

    $ ./getOptTemplate.sh -library OC1231
    Invalid option - '-library'
    Try -h or --help for more infomation.
  • 打印 help

    $ ./getOptTemplate.sh -h
    Usage:
    -l, --lib Library Name
    -c, --cell Cell Name
    -v, --view View Name

[ Shell ] 两个 case 实现 GetOptions 效果的更多相关文章

  1. 03 shell编程之case语句与函数

    本文所有内容均来自当年博主当年学习笔记,若有不足欢迎指正 Shell编程之case语句与函数 学习目标: 掌握case语句编程 掌握shell函数的使用 目录结构: Case语句 Case语句的作用 ...

  2. Linux Shell系列教程之(十三)Shell分支语句case … esac教程

    本文是Linux Shell系列教程的第(十三)篇,更多Linux Shell教程请看:Linux Shell系列教程 分支语句非常实用,基本上高级语言都支持分支语句(python 没有),大多数都使 ...

  3. shell for循环+case的脚本(监控程序状态)

    分享一个shell for循环+case的脚本(监控程序状态) 分享一个for循环+case的脚本(监控程序状态并执行相关操作) ,供大家学习参考. 复制代码代码如下: #/bin/bash set ...

  4. 横竖两个数字塔的效果BAT批处理怎么写?

    横竖两个数字塔的效果BAT批处理怎么写?@echo offfor /l %%a in (0,1,1) do (        for /l %%i in (0,1,9) do (        for ...

  5. shell脚本中case的用法

    shell脚本中case选择语句可以结合read指令实现比较好的交互应答操作,case接收到read指令传入的一个或多个参数,然后case根据参数做选择操作. case的语法如下 case $char ...

  6. shell编程之case分支语句

    shell编程之case分支语句 case分支语句和if的多分支语句很相似. if多分支语句一般用在有(区间范围)的地方 :例如:0-100之间. if需要判断多个不同的条件. case的分支语句用在 ...

  7. python实现基于两张图片生成圆角图标效果的方法

    python实现基于两张图片生成圆角图标效果的方法 这篇文章主要介绍了python实现基于两张图片生成圆角图标效果的方法,实例分析了Python使用pil模块进行图片处理的技巧,分享给大家供大家参考. ...

  8. python如何实现像shell中的case功能

    我们知道在shell脚本里是支持case语句,当位置参数为空时,会提示我们怎么使用脚本 那么在python怎么实现呢?也使用case吗? python里不支持case语句,但是也有实现case的方法. ...

  9. OC可点击的两种轮播图效果

    基本上,每一个APP都有一个轮播图的效果展示,一般都是用来展示图片的一些信息,然后可以点击查看或购买,所以在此我将这种轮播图进行了一个类的封装,效果包含两种形式:第一种,来回轮转样式,第二种,一个方向 ...

随机推荐

  1. 一个好用的多方隐私求交算法库JasonCeng/MultipartyPSI-Pro

    Github链接传送:JasonCeng/MultipartyPSI-Pro 大家好,我是阿创,这是我的第29篇原创文章. 今天是一篇纯技术性文章,希望对工程狮们有所帮助. 向大家推荐一个我最近改造的 ...

  2. 《深度探索C++对象模型》第二章 | 构造函数语意学

    默认构造函数的构建操作 默认构造函数在需要的时候被编译器合成出来.这里"在需要的时候"指的是编译器需要的时候. 带有默认构造函数的成员对象 如果一个类没有任何构造函数,但是它包含一 ...

  3. Ribbon负载均衡及其应用

    nginx - 随笔分类 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中涉及到负载均衡,为何此处由涉及Ribbon负载均衡呢?那是因为ngnix是服务端的负责均衡,而Ribbon是客户 ...

  4. JAVA8学习——新的时间日期API&Java8总结

    JAVA8-时间日期API java8之前用过的时间日期类. Date Calendar SimpleDateFormat 有很多致命的问题. 1.没有时区概念 2.计算麻烦,实现困难 3.类是可变的 ...

  5. 『德不孤』Pytest框架 — 4、Pytest跳过测试用例

    目录 1.无条件跳过skip 2.有条件跳过skipif 3.练习 自动化测试执行过程中,我们常常出现这种情况:因为功能阻塞,未实现或者环境有问题等等原因,一些用例执行不了, 如果我们注释掉或删除掉这 ...

  6. 记一次腾讯云服务器centos linux可视化桌面安装并进行远程桌面登录及其安装中文包

    开始前请确保你有能上网的主机两部(一个是CentOS7系统,一个是Windows10系统)1.用SSH root用户登录Centos主机:2.检查你的centos是否装了epel库 执行命令:rpm ...

  7. CVE-2017-0213漏洞复现

    CVE-2017-0213漏洞形成的原因 类型混淆的漏洞通常可以通过内存损坏的方式来进行利用.然而漏洞发现者在利用时,并未采用内存损坏的方式来进行漏洞利用.按照漏洞发现者的说法,内存损坏的利用方式需要 ...

  8. 学习Spring5必知必会(6)~Spring DAO

    一.Spring 对持久层技术的支持 Spring DAO 1.模板类: 2.基类: 二.spring JDBC [JDBCTemplate 模板类] 1.案例:使用jdbc 完成crud操作 (1) ...

  9. 【C# 集合】HashTable .net core 中的Hashtable的实现原理

    上一篇我介绍了Hash函数 这篇我来说一下Hash函数在 HashTable中的应用. HashTable的特性: 1.装载因子:.net core 0.72 ,java 0.75 2.冲突解决方案: ...

  10. 反编译C#代码来看看闭包到底是什么

    原文地址:https://zhuanlan.zhihu.com/p/3161634 C#的闭包,是一个语法糖. 它实质上是将匿名函数转换成一个类,函数作为其中的类方法,并调整外部调用代码来实现的.既然 ...