awk,perl,python的命令行参数处理
Python,Perl,Bash命令行参数 Part I
日常经常性的和Perl,Python,Bash打交道,但是又经常性的搞混他们之间,在命令行上的特殊性和index的区别,Python真的是人性化到家了,但是命令行上就很原始,但是很有分类感。还是会喜欢Perl一点(至少还可以动脑子,不至于生锈),感觉Perl是个杂合子,而python像胡彦斌,bash像韩红(最近看我是歌手第三季,嘻嘻)。Bash就是家常菜了,虽然Perl可以大部分代替Bash的功能,像grep sort map等,但是某些时候真心很麻烦,还是直接在命令行中bash好一些和命令感觉好。[如不苟同,忍气吞声就好]
下面将是我很多一部分的其中一小部分的开始,由于不断的装系统,更换系统过程中造成了很多总结的丢失,现在又要重新开始整理,很恼火,但是,回想旧爱也是甜蜜的。
基础篇
Perl
默认的命令行参数保存在@ARGV数组中
获取用 $ARGV[0],$ARGV[1],… 来表示第1个,第2个参数,…
$0表示当前脚本的文件名,和Bash一样
注意:就即使你是perl script.pl A B C,$0也会是script.pl,而不会是perl
Python
是需要sys模块
import sys
sys.argv是一个list,列表(用sys.argv.__class__查看)
获取用sys.argv[1],sys.argv[2],… 来表示第1个,第2个参数,…
sys.argv[0]表示文件名
Bash
是直接用$n,$@,$*表示所有的参数[有区别,see below]
获取用$1,$2,… 来表示第1个,第2个参数
$0始终表示文件名,即使在函数中
bash的每个函数也是这个规律的,$@表示所有
$0,$1,$2分别表示第1个,第2个,第3个传递给函数的参数
> cat test.sh
#!/bin/bash
function aa() {
echo $, $,$
}
aa I love you
结果:test.sh,I,love
提升篇
很多时候,要共享脚本,要写清楚参数的顺序才可以,不然天知道该怎么传参数,如果看代码也不知道什么顺序。可以用注释注明顺序,或者写个usage()和简单的-h选项也可以,但谁能保证你的代码就可以被正常运行的,所以嘛,还是用getopts比较好,Linux/Unix有原生的getopt(s)命令的,Python和Perl也有相应的模块可以使用。
Bash
先看一个例子(getopts)
> cat vallis.sh
YON="don’t love"
while getopts 'F:nO:t:' OPT; do
case $OPT in
F) Who=$OPTARG;;
n) YON='love';;
O) TGT=$OPTARG;;
t) TL=$OPTARG;;
?) echo '-h for help';;
esac
done
echo $Who $YON $TGT $TL
shift $(($OPTIND - ))
echo $*
> sh untitled.sh -F I -O you -t baby -n forever
结果是
I love you baby
forever
解析一下就是
先是一个while框架循环
while …;do
…
done
再是 getopts 'F:nO:t:’ OPT 就是按optstring提取相应的值到$OPTARG中
每次只提取一个,所以使用到while循环,当然可以使用for loop了
optstring部分的'F:nO:t:’
- 每个字母代表一个短选项(short option),带冒号:的表示有选项值的,不带的表示没有值,相当于开关true/false
- 不在optstring中的会给出警告信息,可以在最前面加上:就可以了
- 2个很重要的参数是OPTARG和OPTINT(1-based),$OPTARG表示当前选项的值,$OPTINT表示在参数列表中的位移
- 选项(-)和选项值之间的空格是可有可无的(Mac OS X 10.10下成功)
- 不支持长选项(—)
- option部分必须写在其他参数之前,从OPTINT看出
紧接着是case框架分选
case $i in
…) statement1
statement2;; #注意每个块(block)结束的时候要用;;分割
…
esac
shift $(($OPTIND - 1))是将argv中的剩下的不是opt部分(opt部分已经处理过了)的参数重新set为$1,$2,…
$*,$@,这样剩下的参数可以用$n来访问,也就是说,删去了前面的option部分
上面的结果中的forever就是这样的
如果不用shift的话,$1仍然是-F,$2是I,...
总体上bash的这个和linux C语言的一样繁琐,只适合简单的选项设置
Another
还有一个getopt命令,是bash内置的(built-ins),上面的getopts是外置的(not built-ins)
区别在于getopt的参数是有-的(leading dash)并且和set结合使用
> cat valli.sh
YON="don’t love"
args=`getopt F:nO:t: $*`
for i; do
case $i in
-F)
shift # shift out -F then $ is its value
Who=$
shift;;
# can be replaced by
# Who=$
# shift ;;
# appliable to -O and -t or any option with a value
-n)
YON='love'
shift;;
-O)
shift
TGT=$
shift;;
-t)
shift
TL=$
shift;;
24 esac
done
echo $Who $YON $TGT $TL
echo $*
或者
> cat valli2.sh
YON="don’t love"
args=`getopt F:nO:t: $*`
set -- $args # but I think useless []
for i; do
case "$i" in
-F)
Who=$
shift ;;
-n)
YON='love'
shift;;
-O)
TGT=$
shift ;;
-t)
TL=$
shift ;;
--)
shift
break;;
esac
done
echo $Who $YON $TGT $TL
echo $*
同样成功
好原始,真的就和linux C语言没什么区别
注意
- getopt在Mac OS X 10.10反正不支持—long -n -o 等getopt参数[4],具体可以看reference:4
- getopt是内置的命令,getopts只能在shell script中
Perl
perl的getopt是常用的Getopt::Long,Getopt::Std模块,这个就比较智能了,排除不兼容[6]
先看一下例子
use Getopt::Std; %options=();
getopts("F:O:nt:", \%options); #high spot
$does="don't love";
print "$options{F} " if defined $options{F};
if (defined $options{n}){
$does='love';
print "$does ";
}
print "$options{O} " if defined $options{O};
print "$options{t}\n" if defined $options{t};
print "@ARGV\n”;
就像写英语作文一样顺畅自如,仿佛在交流。但是着实是个话痨。
开始的%options哈希表的key为option,value为option value
Python
就是optaprse以及更新版argparse,但是更习惯用optparse,尽管2.7版之后不再开发。
我有一篇论述:
Reference:
1.http://blog.csdn.net/t0nsha/article/details/8180553
2.http://blog.csdn.net/zynong/article/details/6306486
3.https://docs.python.org/3/library/getopt.html?highlight=getopt#module-getopt
4.http://blog.csdn.net/breeze_life/article/details/9998645
5.http://blog.163.com/code4fun@126/blog/static/45776537201012311432182/
6.http://www.cnblogs.com/zjking99/articles/2117258.html
7.http://alvinalexander.com/perl/perl-getopts-command-line-options-flags-in-perl
如果你对某处或者某段错误忍无可忍或者急切希望改进,可以评论,微博私信,或者email给我antisunny@qq.com
awk,perl,python的命令行参数处理的更多相关文章
- python处理命令行参数
直接从命令行执行py文件的时候如果带有参数,如何获取这些参数,如何解析? http://blog.chinaunix.net/uid-20786165-id-3182268.html sys.argv ...
- Python 的命令行参数处理 optparse->argparse
optaprse自2.7版开始弃用:弃用optparse模块,不会进一步开发,将继续开发argparse模块作为替代. 但是用习惯了optparse,还是很好用的撒. optparse使用起来,相比旧 ...
- Python 获得命令行参数的方法
如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?需要模块:sys参数个数:len(sys.argv)脚本名: sys.argv[0]参数1 ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- python 处理命令行参数--转载
标题写了那么久,现在现在才有时间,整理下自己的思路.首先先总结下自己对sys模块的理解.手册上对sys的描述是系统参数和系统函数,这里的系统实际上是python解释器.这个模块提供了用户可以访问的解释 ...
- python中命令行参数
python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 le ...
- Python 中命令行参数解析工具 docopt 安装和应用
什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...
- Python的命令行参数(argparse)
参考:https://www.cnblogs.com/lindaxin/p/7975697.html 参考:https://www.cnblogs.com/dengtou/p/8413609.html ...
- python之命令行参数解析模块argparse
"""argparse模块使得写用户友好性命令行接口很容易,程序定义所需要的参数,argparse会从ays.argv中提取出这些参数.argparse模块也能自动的产生 ...
随机推荐
- iOS: 实现苹果的内购
一.介绍: 在个人开发的app上架到AppStore后,苹果官方允许我们将自己的app在appstore上进行付费使用,也就是所谓的内购.其中,支付方式规定的必须是苹果的支付方式:应用内支付. 二.流 ...
- Linux版OpenVPN安装、配置教程(转)
本文将以目前最新的openvpn-2.3.4.tar.gz(更新于2014-5-2,下载地址)为例来介绍如何在Linux系统中安装.配置及使用OpenVPN. 在这里,我们选用了一台预装CentOS ...
- ionic安装时遇到的minimatch错误
安装提示 npm WARN deprecated minimatch@2.0.10: Please update to minimatch 3.0.2 or higher to avoid a Reg ...
- RFS_注释
1. 注释的操作如下:
- python_遇到问题
1. [出现问题]:cx_Oracle.DatabaseError: ORA-24315: 非法的属性类型 [原因]:是因为版本不兼容,检查了一下环境,我的oracle client是10g的,但我安 ...
- D3D标注动态避让
原来也思考了该如何实现标注动态避让,认为必须得计算字符串所占的大小.如果在屏幕上要计算屏幕象素之类的东西. 今天总算找到了实现方法,在C# WorldWind中的KMLImporter类中有.关键是F ...
- iTOP-4412 平台基础软件的安装和学习
这两天在电脑上根据开发手册安装了超级终端.虚拟机.Ubuntu.以及Vim 编辑器等开发所必备的环境 1.笔记本没有串口,从实验室找了USB 转串口线来连接开发板和PC,从网盘找到并安装了USB 转串 ...
- Private strand flush not complete
当切换日志的时候,所有private strands的内容都会被flush到当前的日志中,然后日志切换才可以完成. strand是在oracle 10g中引入的新术语,和redo的latches相关. ...
- oc 正则图片<img /> 标签
-(NSString *)getImageAttributeValue:(NSString *)content attributeKey:(NSString *)key { NSString *reg ...
- jquery垂直展开折叠手风琴二级菜单
摘要:jquery实现垂直展开二级菜单 最近新开发一个简单项目,用到左侧两级的菜单.找找了手头的文件,竟然没有现成的代码,算了,去网上找找整理下吧. 注:jquery-1.8.3.min.js需要下载 ...