设为首页 收藏本站
查看: 739|回复: 0

[经验分享] awk,perl,python的命令行参数处理

[复制链接]

尚未签到

发表于 2015-12-2 10:27:20 | 显示全部楼层 |阅读模式
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



1 #!/bin/bash
2 function aa() {
3     echo $0, $1,$2
4 }
5 aa I love you
结果:test.sh,I,love


提升篇



很多时候,要共享脚本,要写清楚参数的顺序才可以,不然天知道该怎么传参数,如果看代码也不知道什么顺序。可以用注释注明顺序,或者写个usage()和简单的-h选项也可以,但谁能保证你的代码就可以被正常运行的,所以嘛,还是用getopts比较好,Linux/Unix有原生的getopt(s)命令的,Python和Perl也有相应的模块可以使用。

Bash
先看一个例子(getopts)

> cat vallis.sh



1 YON="don’t love"
2 while getopts 'F:nO:t:' OPT; do
3     case $OPT in
4         F) Who=$OPTARG;;
5         n) YON='love';;
6         O) TGT=$OPTARG;;
7         t) TL=$OPTARG;;
8         ?) echo '-h for help';;
9     esac
10 done
11 echo $Who $YON $TGT $TL
12 shift $(($OPTIND - 1))
13 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



1 YON="don’t love"
2 args=`getopt F:nO:t: $*`
3 for i; do
4     case $i in
5         -F)
6             shift # shift out -F then $1 is its value
7             Who=$1
8             shift;;
9             # can be replaced by
10             # Who=$2
11             # shift 2;;
12             # appliable to -O and -t or any option with a value
13         -n)
14             YON='love'
15             shift;;
16         -O)
17             shift
18             TGT=$1
19             shift;;
20         -t)
21             shift
22             TL=$1
23             shift;;
24     esac
25 done
26 echo $Who $YON $TGT $TL
27 echo $*
或者
> cat valli2.sh



1 YON="don’t love"
2 args=`getopt F:nO:t: $*`
3 set -- $args #  but I think useless [5]
4 for i; do
5     case "$i" in
6         -F)
7             Who=$2
8             shift 2;;
9         -n)
10             YON='love'
11             shift;;
12         -O)
13             TGT=$2
14             shift 2;;
15         -t)
16             TL=$2
17             shift 2;;
18         --)
19             shift
20             break;;
21     esac
22 done
23 echo $Who $YON $TGT $TL
24 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]
先看一下例子



1 use Getopt::Std;
2  
3 %options=();
4 getopts("F:O:nt:", \%options); #high spot
5 $does="don't love";
6 print "$options{F} " if defined $options{F};
7 if (defined $options{n}){
8     $does='love';
9     print "$does ";
10 }
11 print "$options{O} " if defined $options{O};
12 print "$options{t}\n" if defined $options{t};
13 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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146233-1-1.html 上篇帖子: 深入Python函数定义 下篇帖子: python使用mysql数据库(虫师)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表