linux getopts学习笔记
http://www.linuxeden.com/html/develop/20100630/103593.html
?????? 獲取UNIX類型的選項:
unix有一個優點就是標準UNIX命令在執行時都具有相同的命令行格式:
command -options parameters
如果在執行Shell程序也采用上述格式,Bourne Shell中提供了一條獲取和處理命令行選項的語句,即getopts語句。該語句的格式為:
getopts option_string variable
其中option_string中包含一個有效的單字符選項。若getopts命令在命令行中發現了連字符,那么它將用連字符后面的字符同option_string相比較。若有匹配,則把變量variable的值設為該選項。若無匹配,則variable設為?。當getopts發現連字符后面沒有字符,會返回一個非零的狀態值。Shell程序中可以利用getopts的返回值建立一個循環。
有時侯選項中還帶一個值,getopts命令同樣也支持這一功能。這時需要在option_string中選項字母后加一個冒號。當getopts命令發現冒號后,會從命令行該選項后讀取該值。若該值存在,那么將被存在一個特殊的變量OPTARG中。如果該值不存在,getopts命令將在OPTARG中存放一個問號,并且在標準錯誤輸出上顯示一條消息。
optstring? option字符串,會逐個匹配
varname??? 每次匹配成功的選項
arg??????? 參數列表,沒寫時它會取命令行參數列表
$OPTIND??? 特殊變量,option index,會逐個遞增, 初始值為1
$OPTARG??? 特殊變量,option argument,不同情況下有不同的值
細則1:當optstring以”:“開頭時,getopts會區分invalid option錯誤和miss option argument錯誤。
invalid option時,varname會被設成?,$OPTARG是出問題的option;
miss option argument時,varname會被設成:,$OPTARG是出問題的option。
如果optstring不以”:“開頭,invalid option錯誤和miss option argument錯誤都會使
varname被設成?,$OPTARG是出問題的option。
細則2:當optstring中的字母跟”:“時,表明該option可接參數,參數(argument)放在$OPTARG中;
如果缺參數,且optstring是以”:“開頭,則varname的值會是:,$OPTARG是該option,
否則varname的值是?,$OPTARG是該option。(參照細則1)
---------------
$ # 傳遞到腳本的參數個數
$ * 以一個單字符串顯示所有向腳本傳遞的參數。與位置變量不同,此選項參數可超過9個
$ $ 腳本運行的當前進程I D號
$ ! 后臺運行的最后一個進程的進程I D號
$ @ 與$ #相同,但是使用時加引號,并在引號中返回每個參數
$ - 顯示s h e l l使用的當前選項,與s e t命令功能相同
$ ? 顯示最后命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤。
------------
shift 用于重新分配位置參數,其實就是把向參數左移動一個位置如:$1<--$2,$2<--$3老的$1將被刪 除掉。
------------
范例:
[root@localhost ~]# cat getopts2
#!/bin/sh
while getopts :ab: name
do
case $name in
a)? aflag=1
;;
b)? bflag=1
bval=$OPTARG
;;
\?) echo "USAGE:`basename $0` [-a] [-b value]"
exit? 1
;;
esac
done
if [ ! -z $aflag ] ; then
echo?? "option -a specified"
echo? "$aflag"
echo "$OPTIND"
fi
if [ ! -z $bflag ] ; then
echo?? "option -b specified"
echo? "$bflag"
echo? "$bval"
echo? "$OPTIND"
fi
echo "here? $OPTIND"
shift $(($OPTIND -1))
echo "$OPTIND"
echo " `shift $(($OPTIND -1))`? "
?
?
http://www.chinaitpower.com/2005September/2005-09-13/204604.html
getopts option_string variable???
具體使用方法請參考getopts的在線文檔(man getopts).
使用getopts命令讀取unix格式選項
??? UNIX格式選項指如下格式的命令行參數:
??? command -options parameters
?
??? 使用格式:
??? getopts option_string variable
?
??? 具體使用方法請參考getopts的在線文檔(man getopts).
?
??? 示例如下:
?
???????? #newdate
???????? if [ $# -lt 1 ]
???????? then
???????????? date
???????? else
??????????? while getopts mdyDHMSTjJwahr OPTION
??????????? do
?????????????? case $OPTION
?????????????? in
????????????????? m) date '+%m ';;? # Month of Year
????????????????? d) date '+%d ';;? # Day of Month
????????????????? y) date '+%y ';;? # Year
????????????????? D) date '+%D ';;? # MM/DD/YY
????????????????? H) date '+%H ';;? # Hour
????????????????? M) date '+%M ';;? # Minute
????????????????? S) date '+%S ';;? # Second
????????????????? T) date '+%T ';;? # HH:MM:SS
????????????????? j) date '+%j ';;? # day of year
????????????????? J) date '+%y%j ';;# 5 digit Julian date
????????????????? w) date '+%w ';;? # Day of the Week
????????????????? a) date '+%a ';;? # Day abbreviation
????????????????? h) date '+%h ';;? # Month abbreviation
????????????????? r) date '+%r ';;? # AM-PM time
????????????????? \?) echo "Invalid option $OPTION";;
?????????????? esac
??????????? done
???????? fi
?
???????? $ newdate -J
???????? 94031
???????? $ newdate -a -h -d
???????? Mon
???????? Jan
???????? 31
???????? $ newdate -ahd
???????? Mon
???????? Jan
???????? 31
???????? $
?
?
???????? 示例程序:復制程序
?
???????? # Syntax: duplicate [-c integer] [-v] filename
???????? #??? where integer is the number of duplicate copies
???????? #??? and -v is the verbose option
?
???????? COPIES=1
???????? VERBOSE=N
?
?
???????? while getopts vc: OPTION
???????? do
??????????? case $OPTION
??????????? in
?????????????? c) COPIES=$OPTARG;;
?????????????? v) VERBOSE=Y;;
?????????????? \?) echo "Illegal Option"
?????????????????? exit 1;;
??????????? esac
???????? done
?
???????? if [ $OPTIND -gt $# ]
???????? then
??????????? echo "No file name specified"
??????????? exit 2
???????? fi
?
?
???????? shift `expr $OPTIND -1`
?
???????? FILE=
???????? COPY=0
?
???????? while [ $COPIES -gt $COPY ]
???????? do
??????????? COPY=`expr $COPY + 1`
??????????? cp $FILE $$
??????????? if [ VERBOSE = Y ]
??????????? then
?????????????? echo $$
??????????? fi
???????? done
?
?
???????? $ duplicate -v fileA
???????? fileA1
???????? $ duplicate -c 3 -v fileB
???????? fileB1
???????? fileB2
???????? fileB3?
?
總結
以上是生活随笔為你收集整理的linux getopts学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux可执行文件格式
- 下一篇: linux egrep新添的正则表达式元