問:linux系統命令如ls,它有幾十個參數,可帶一個或多個參數,可不分前後,用起來是很是的專業。可是本身寫的傳參腳本,通常只傳一個參數,若是傳多個,也是固定的順序,那麼如何用python寫出更專業的傳參腳本呢?python
答:使用python自帶的getopt模塊。linux
1、語法:ide
import getopt函數
getopt.getopt(args,shortopts, longopts=[])spa
#函數示例:getopt.getopt(sys.argv[1:],'u:p:P:h',["username=","password=","port=","help"])ip
#輸出格式:[('-p', '123'),('-u', 'root')] [] #後面中括號包含沒有"-"或"--"的參數get
2、參數說明:it
args 全部傳參參數,通常用sys.argv[1:]表示,即全部傳參內容;class
shortopts短格式,通常參數如-u,-p,-h等(一個"-"的)就是短格式;那寫在函數中就是"u:p:P:h",有冒號表明有參數,沒冒號表明沒參數。test
longopts 長格式,通常參數如--username,--password,--help等(兩個"-"的)就是長格式;那寫在函數中就是["usrname=",'password=","help"],其中--help是沒有值的,因此沒有等於號。其它有等於號,表示後面須要參數。
3、演示效果:
短格式傳參:
[root@yang scripts]# python getopt_test.py -u yangyun -p 123456 -P 2222
username: yangyun
password: 123456
port: 2222
長格式傳參:(也能夠加=號)
[root@yang scripts]# python getopt_test.py --username yangyun --password 123456 --port 2222
username: yangyun
password: 123456
port: 2222
長短格式都用:
[root@yang scripts]# python getopt_test.py --username=yangyun -p 123456 --port 2222
username: yangyun
password: 123456
port: 2222
只傳單個參數,其它是默認值:
[root@yang scripts]# python getopt_test.py -p 123456
username: root
password: 123456
port: 22
#此處port與user都用的默認值,默認值在函數裏指定
4、python傳參腳本實例:
# cat getopt_test.py
#!/usr/bin/python #by yangyun 2015-1-11 import getopt import sys #導入getopt,sys模塊 #定義幫助函數 def help(): print "Usage error!" sys.exit() #輸出用戶名 def username(username): print 'username:',username #輸出密碼 def password(password): if not password: help() else: print 'password:',password #輸出端口 def port(port): print 'port:',port #獲取傳參內容,短格式爲-u,-p,-P,-h,其中-h不須要傳值。 #長格式爲--username,--password,--port,--help,長格式--help不須要傳值。 opts,args=getopt.getopt(sys.argv[1:],'u:p:P:h',["username=","password=","port=","help"]) #print opts,' ' ,args #設置默認值變量,當沒有傳參時就會使用默認值。 username_value="root" port_value='22' password_value='' #密碼不使用默認值,因此定義空。 #循環參數列表,輸出格式爲:[('-p','123'), ('-u', 'root')] [] for opt,value in opts: if opt in("-u","--username"): username_value=value #若是有傳參,則從新賦值。 if opt in("-p","--password"): password_value=value if opt in("-P","--port"): port_value=value if opt in("-h","--help"): help() #執行輸出用戶名、密碼、端口的函數,若是有變量沒有傳值,則使用默認值。 username(username_value) password(password_value) port(port_value)