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,[email protected],$*表示所有的参数[有区别,see below]

获取用$1,$2,… 来表示第1个,第2个参数

$0始终表示文件名,即使在函数中

bash的每个函数也是这个规律的,[email protected]表示所有

$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:’

  1. 每个字母代表一个短选项(short option),带冒号:的表示有选项值的,不带的表示没有值,相当于开关true/false
  2. 不在optstring中的会给出警告信息,可以在最前面加上:就可以了
  3. 2个很重要的参数是OPTARG和OPTINT(1-based),$OPTARG表示当前选项的值,$OPTINT表示在参数列表中的位移
  4. 选项(-)和选项值之间的空格是可有可无的(Mac OS X 10.10下成功)
  5. 不支持长选项(—)
  6. option部分必须写在其他参数之前,从OPTINT看出

紧接着是case框架分选

case $i in

…) statement1

statement2;; #注意每个(block)结束的时候要用;;分割

esac

shift $(($OPTIND - 1))是将argv中的剩下的不是opt部分(opt部分已经处理过了)的参数重新set为$1,$2,…

$*,[email protected],这样剩下的参数可以用$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语言没什么区别

注意

  1. getopt在Mac OS X 10.10反正不支持—long -n -o 等getopt参数[4],具体可以看reference:4
  2. 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/[email protected]/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给我[email protected]

时间: 2024-12-20 14:27:31

awk,perl,python的命令行参数处理的相关文章

Python 的命令行参数处理 optparse->argparse

optaprse自2.7版开始弃用:弃用optparse模块,不会进一步开发,将继续开发argparse模块作为替代. 但是用习惯了optparse,还是很好用的撒. optparse使用起来,相比旧的getopt模块,更方便.灵活而且解析命令行选项的库功能强大. optparse使用声明样式的命令行解析:你创建一个OptionParser实例,填充选项,并解析命令行. optparse允许用户使用在传统GNU / POSIX语法的选项,而且会生成的使用和帮助信息(就是你没有显式的定义-h/--

Python 获得命令行参数的方法

本篇将介绍python中sys, getopt模块处理命令行参数 如果想对python脚本传参数,python中对应的argc, argv(c语言的命令行参数)是什么呢?需要模块:sys参数个数:len(sys.argv)脚本名: sys.argv[0]参数1: sys.argv[1]参数2: sys.argv[2] test.py 1 import sys 2 print "脚本名:", sys.argv[0] 3 for i in range(1, len(sys.argv)):

Python处理命令行参数

1. 将命令行参数保存在列表中,注意argv[0]是程序本身的名字: import sys print(sys.argv) print(sys.argv[1]) python argv.py localhost 3306['argv.py', 'localhost', '3306']localhost 2. 使用sys.stdin和fileinput读取标准输入,并打印在终端类似shell中的管道 import sys for line in sys.stdin: print(line,end=

python中命令行参数

python中的命令行参数 python中有一个模块sys,sys.argv这个属性提供了对命令行参数的访问.命令行参数是调用某个程序时除程序名外的其他参数. sys.argv是命令行参数的列表 len(sys.argv)是命令行参数的个数 下面我们用一个简单的例子来说明一下. #!/usr/bin/python #coding:utf-8 import sys ##加载sys这个模块. for i in range(len(sys.argv)): print "第%d个参数是:%s"

Python 中命令行参数解析工具 docopt 安装和应用

什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制.这样脚本在执行的时候就必须按照这样格式来执行,同时,也可以很方便的编写一些帮助信息(其实很多软件在输入 -h 的时候显示信息 .例如 python -h ,会显示所有的 python 指令,并且页通过 docopt 限制了 python 指令的格式),下面是一些简单的例子: docopt 的安装 d

python添加命令行参数和异常处理

异常处理+命令行解析库argparse Socket.error 与一般I/O和通信问题有关的 Socket.gaierror 与查询地址有关的 Socket.herror 与其他地址错误有关 Socket.timeout 与一个socket上调用settimeout()后,超时处理有关 #-*- coding:utf-8 -*- import sys import socket import argparse #通过命令行输入参数 python 1_7_socket_errors.py --h

python的命令行参数处理

import argparse # A position argument func_choice = {'client' : 'client function', "server" : "server function"} # parser parser = argparse.ArgumentParser(description = "Select your favorite function") # add argument parser.a

python 命令行参数sys.argv

python中命令行参数和shell不一样,是通过sys.argv[]来获取的,sys.argv[0]是代码文件本身的路径,因此参数是从1开始的, 例子: #!/usr/bin/env python import os import json import os, sys #t=os.popen("""netstat -natp|awk -F: '/redis-server/&&/LISTEN/{print $2}'|awk '{print $1}' &quo

python 命令行参数学习(一)

用了这么久,还没怎么学习python的命令行参数,是在惭愧. 参考文章地址:http://www.cnblogs.com/jianboqi/archive/2013/01/10/2854726.html 自己的代码实例: #-*-coding:utf-8-*- __author__ = 'Deen' ''' import argparse parser = argparse.ArgumentParser() parser.parse_args() ''' ''' import argparse