python getopts_getopts用法
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用法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python动态改变标签的颜色_PyQt
- 下一篇: python分支switch_Pytho