getopts可以编写脚本,使控制多个命令行参数更加容易。getopts用于形成命令行处理标准形式。原则上讲,脚本应具有确认带有多个选项的命令文件标准格式的能力。

2.1

getopts脚本实例通过例子可以更好地理解getopts。以下getopts脚本接受下列选项或参数。•a设置变量ALL为true•h设置变量HELP为true

•f设置变量FILE为true•v设置变量VERBOSE为true

对于所有变量设置,一般总假定其初始状态为false:

[sam@chenwy sam]$ ./getopt1 -a -h

ALL is true

HELP is true

[sam@chenwy sam]$ cat getopt1

#!/bin/sh

ALL=false

HELP=false

FILE=false

VERBOSE=false

while getopts ahfgv OPTION

do

case $OPTION in

a)ALL=true

echo "ALL is $ALL"

;;

h)HELP=true

echo "HELP is $HELP"

;;

f)FILE=true

echo "FILE is $FILE"

;;

v)VERBOSE=true

echo "VERBOSE is $VERBOSE"

;;

esac

done

getopts一般格式为:getopts option_string variable在上述例子中使用脚本:while getopts ahfgv OPTION可以看出while循环用于读取命令行,options_string为指定的5个选项(-a,-h,-f,-g,-v),脚本中varible为OPTION。注意这里并没有用连字符指定每一单个选项。运行上述脚本,给出几个有效和无效的选项,结果为:

[sam@chenwy sam]$ ./getopt1 -a -h

ALL is true

HELP is true

[sam@chenwy sam]$ ./getopt1 -a -h -p

ALL is true

HELP is true

./getopt1: illegal option -- p

[sam@chenwy sam]$ ./getopt1 -p

./getopt1: illegal option -- p

可以看出不同选项的结合方式。

2.2

getopts使用方式getopts读取option_string,获知脚本中使用了有效选项。getopts查看所有以连字符开头的参数,将其视为选项,如果输入选项,将把这与option_string对比,如果匹配发现,变量设置为OPTION,如果未发现匹配字符,变量能够设置为?。重复此处理过程直到选项输入完毕。getopts接收完所有参数后,返回非零状态,意即参数传递成功,变量OPTION保存最后处理参数,一会儿就可以看出处理过程中这样做的好处。

2.3使用getopts指定变量取值有时有必要在脚本中指定命令行选项取值。getopts为此提供了一种方式,即在option_string中将一个冒号放在选项后。例如:getopts ahfvc: OPTION上面一行脚本指出,选项a、h、f、v可以不加实际值进行传递,而选项c必须取值。使用选项取值时,必须使用变量OPTARG保存该值。如果试图不取值传递此选项,会返回一个错误信息。错误信息提示并不明确,因此可以用自己的反馈信息屏蔽它,方法如下:将冒号放在option_string开始部分。while getopts :ahfgvc: OPTION在case语句里使用?创建一可用语句捕获错误。

[sam@chenwy sam]$ cat getopt1

#!/bin/sh

ALL=false

HELP=false

FILE=false

VERBOSE=false

COPIES=0

while getopts :ahfgvc: OPTION

do

case $OPTION in

a)ALL=true

echo "ALL is $ALL"

;;

h)HELP=true

echo "HELP is $HELP"

;;

f)FILE=true

echo "FILE is $FILE"

;;

v)VERBOSE=true

echo "VERBOSE is $VERBOSE"

;;

c)COPIES=$OPTARG

echo "COPIES is $COPIES"

;;

?)

echo "`basename ` -[a h f v] -[c value] file"

;;

esac

done

输入所有合法选项:

[sam@chenwy sam]$ ./getopt1 -ah -c 3

ALL is true

HELP is true

COPIES is 3

选项- c不赋值,将返回错误,但显示的是脚本语句中的反馈信息[sam@chenwy sam]$ ./getopt1 -ah -c

ALL is true

HELP is true

getopt1 -[a h f v] -[c value] file

去掉前面的冒号,提到系统的提示消息

:[sam@chenwy sam]$ ./getopt1 -ah -c

ALL is true

HELP is true

./getopt1: option requires an argument -- c

2.4访问取值方式getopts的一种功能是运行后台脚本。这样可以使用户加入选项,指定不同的磁带设备以备份数据。使用getopts实现此任务的基本框架如下:

[sam@chenwy sam]$ cat backups

#!/bin/sh

OUITE=n

DEVICE=awa

LOGFILE=/tmp/logbackup

usage()

{

echo "Usage: `basename ` -d [device] -l [logfile] -q"

exit 1

}

if [ $# = 0 ]

then

usage

fi

while getopts :qd:l: OPTION

do

case $OPTION in

q) QUIET=y

LOGFILE="/tmp/backup.log"

;;

d)DEVICE=$OPTION

;;

l)LOGFILE=$OPTARG

;;

?)usage

;;

esac

done

echo "you chlose the ..."

echo "Quite=$QUIET $DEVICE $LOGFILE"

上述脚本中如果指定选项d,则需为其赋值。该值为磁带设备路径。用户也可以指定是否备份输出到登录文件中的内容。运行上述脚本,指定下列输入:

[sam@chenwy sam]$ ./backups -d /dev/rmt0 -q

you chlose the ...

Quite=y d /tmp/backup.log

getopts检查完之后,变量OPTARG取值可用来进行任何正常的处理过程。当然,如果输入选项,怎样进行进一步处理及使该选项有有效值,完全取决于用户。以上是使用getopts对命令行参数处理的基本框架。实际处理文件时,使用for循环,就像在tr-case脚本中使用shift命令过滤所有选项一样。使用getopts与使用shift方法比较起来,会减少大量的编程工作。

2.5使用getopts处理文件转换现在用所学知识将tr-case脚本转换为getopts版本。命令行选项getopts方法与shift方法的唯一区别是一个VERBOSE选项。变量VERBOSE缺省取值为no,但选择了命令行选项后,case语句将捕获它,并将其设为yes,反馈的命令是一个简单的if语句。

if [ "VERBOSE" = "on" ];

thenecho "doing upp on $LOOP ..newfile called

$LOOP$EXT"

fi

如果正在使用其他系统命令包,它总是反馈用户动作,只需简单地将包含错误的输出重定向到/dev/null中即可。如:命令>/dev/null 2 >&1缺省时VERBOSE关闭(即不显示),使用- v选项可将其打开。例如要用VERBOSE将myfile文件系列转换为小写,方法如下:tr-case -l -v myfile1 myfile2 ...或者tr-case -v -l myfile1 myfile2 ...可能首先注意的是使用g e t o p t s后脚本的缩减效果。这里用于文件处理的脚本与s h i f t版本相同。脚本如下:

[sam@chenwy sam]$ cat tr_case1

#!/bin/sh

FILES=""

TRCASE=""

EXT=""

OPT=no

VERBOSE="off"

while getopts :luv OPTION

do

case $OPTION in

l)TRCASE="lower"

EXT=".LC"

OPT=yes

;;

u)TRCASE="upper"

EXT=".UC"

OPT=yes

;;

v)VERBOSE=on

;;

?)echo "usage: `basename `: -[l|u] -v file[s]"

exit 1

;;

esac

done

shift `expr $OPTIND - 1`

if [ "$#" = "0" ] || [ "$OPT" = "no" ]

then

echo "usage: `basename `: -[l|u] -v file[s]"

exit 1

fi

for LOOP in "$@"

do

if [ ! -f $LOOP ]

then

echo "`basename ` :error cannot find file $LOOP"

exit 1

fi

echo $TRCASE $LOOP

case $TRCASE in

lower) if [ "VERBOSE" = "on" ];then

echo "doing...lower on $LOOP..newfile"

fi

cat $LOOP|tr "[a-z]" "[A-Z]" > $LOOP$EXT

;;

upper) if [ "VERBOSE" = "on" ];then

echo "doing upper on $LOOP..newfile"

fi

cat $LOOP|tr "[A-Z]" "[a-z]" >$LOOP$EXT

;;

esac

done

在脚本中指定命令行选项时,最好使其命名规则与U N I X或L I N U X一致。下面是一些选项及其含义的列表。

选项含义- a扩展- c计数、拷贝- d目录、设备- e执行- f文件名、强制- h帮助- i忽略状态- l注册文件- o完整输出- q退出- p路径- v显示方式或版本

3小结正确控制命令行选项会使脚本更加专业化,对于用户来说会使之看起来像一个系统命令。本章讲到了控制命令行选项的两种方法,shift和getopts。使用getopts检测脚本的数量远远小于使用s h i f t方法检测脚本的数量。shift也克服了脚本参数$ 1 . . $ 9的限制。使用shift命令,脚本可以很容易偏移至所有调用参数,因此脚本可以做进一步处理。

python getopts_getopts用法相关推荐

  1. Python pandas用法

    Python pandas用法 无味之味关注 12019.01.10 15:43:25字数 2,877阅读 91,914 介绍 在Python中,pandas是基于NumPy数组构建的,使数据预处理. ...

  2. python goto 用法

    python goto 用法 pip install goto-statement from goto import with_goto @with_goto def range(start, sto ...

  3. Python SQLite 用法

    Python SQLite 用法 具体可以参考网址 代码: #导入 import sqlite3 #连接库,如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象. # test.db:数据路路 ...

  4. import的用法python_Python导入模块,Python import用法(超级详细)

    Python导入模块,Python import用法(超级详细) 使用 Python 进行编程时,有些功能没必须自己实现,可以借助 Python 现有的标准库或者其他人提供的第三方库.比如说,在前面章 ...

  5. python with用法

    @python with用法 python中with可以明显改进代码友好度,比如: [python] view plaincopyprint? with open('a.txt') as f: pri ...

  6. Python高级用法总结

    Python很棒,它有很多高级用法值得细细思索,学习使用.本文将根据日常使用,总结介绍Python的一组高级特性,包括:列表推导式.迭代器和生成器.装饰器. 列表推导(list comprehensi ...

  7. 数据库和python的结合_redis数据库及与python交互用法简单示例

    本文实例讲述了redis数据库及与python交互用法.分享给大家供大家参考,具体如下: redis数据操作 1.string类型:主要存储字符串 操作 命令 设置键值 set key value 设 ...

  8. python输出函数是什么_Python中打印函数使用概述,python,print,用法,总结

    输出的 print 函数总结: 1. 字符串和数值类型 可以直接输出 print(1) 1 print("Hello World") Hello World 2.变量 无论什么类型 ...

  9. Python break用法详解

    文章目录 Python break 用法 Python break 用法 我们知道,在执行 while 循环或者 for 循环时,只要循环条件满足,程序将会一直执行循环体,不停地转圈.但在某些场景,我 ...

最新文章

  1. rabbitMQ简单使用
  2. leetcode刷题之树(三)
  3. 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
  4. 图解基于 Node.js 实现前后端分离 - CSDN博客
  5. 编程语言之父谈语言设计,龟叔大赞TypeScript
  6. Python 文件处理命令
  7. 手把手,从零开始搭建个人博客网站(附源码)
  8. Android 测试技能树
  9. 相关性分析和假设检验
  10. Cardhop for Mac(通讯录管理软件)
  11. 利用python脚本根据DOI号自动查询参考文献信息
  12. 《windows程序设计(C语言版)》笔记
  13. NX的尺寸控制与半径补偿(重要)
  14. 【图形学】计算机图形学的应用领域
  15. 研发团队管理:IT研发中项目和产品原来区别那么大,项目级的项目是项目,产品级的项目是产品!!!
  16. 用java编写租车系统代码_java实现租车系统
  17. 21天学会Java之(Java SE第十三篇):网络编程、TCP/UDP通信
  18. I/O error reading PNG header! java截取png图片时遇到的问题
  19. 自己做QQ–后台搭建
  20. 2.1 Git介绍、安装与使用

热门文章

  1. matlab绘制立体图
  2. CVPR 2018 FlowTrack:《End-to-end Flow Correlation Tracking with Spatial-temporal Attention》论文笔记
  3. 模型学习 - HNN、RBM、DBN
  4. 商店选址问题(Floyd)
  5. luogu P4725 多项式对数函数 (模板题、FFT、多项式求逆、求导和积分)
  6. java启动100线程_Java启动新线程的几种方式(Runnable、Callable、CompletableFuture)
  7. python实现dns劫持_Python程序之DNS劫持
  8. 博图wincc连接数据块_西门子博途WINCC 可通过创建画面模板提高编程效率
  9. github gitlab BitBucket
  10. superset安装配置