如何實作指令行選項的各種個性功能
在前面
指令行選項的那些事中介紹了幾種有"個性"的選項功能,包括:
- 選項依賴:例如"-a"或"--add"要依賴于"-m"或"--manage"選項
- 選項互斥:例如"-a"或"--add"與"-r"或"--remove"是互斥的
- 識别負數參數:例如
,其中-5和-3不是短選項,而是負數參數-w -5 -3 5
- 模式化選項:例如
的MODE部分,可以是manage模式(--manage,-m),也可以使用add模式(--add,-a)script_name MODE OPTIONS
- 選項參數替代選項:例如
可以替換為head -n 3
head -3
這裡介紹下用getopt解析參數後實作它們的思路。
在getopt解析完成後,假設傳回結果儲存到了
$parameters
變量中。
1.選項依賴性
這個其實很好實作,隻需使用grep對
$parameters
變量進行篩選一下即可。
例如實作依賴性,隻需:
{ echo "$parameters" | grep -E '\-\-add|\-a ' | grep -E '\-\-manage|\-m '; } &>/dev/null
[ $? -ne 0 ] && exit
2.選項互斥性
要實作互斥性,隻需:
or_op=`echo "$parameters" | grep -Eo '\-\-add|\-a | \-\-remove|\-r ' | wc -l`
[ "$or_op" = "2" ] && exit
3.識别負數參數
前面解釋過,getopt提供了兩種掃描模式,隻要使用
+
掃描模式,就能輕松差別負數參數和短選項。
4.模式化選項
一般來說,模式化選項都是指令行的第一個參數。是以,隻需将
$parameter
中"--"後面的第一個非選項類型的參數提取出來,就是所謂的模式了。當然,還得對這個參數進行一些判斷,避免它不是模式參數。
例如,要提供addr、show、route三種模式,那麼其它的非選項類型參數值都不應該是模式參數。
eval set -- "$parameters"
while true ; do
case "$1" in
...
--)
shift
[ "$x" = "addr" -o "$x" = "route" -o "$x" = "show" ] && MODE=$1
shift
break ;;
*) echo "wrong";exit 1;;
esac
done
5.選項參數替代選項
就以
-n3
和
-3
為例,它的通用格式是
-n NUM
-NUM
。這個并不好實作,我能想到的方法是将這個
-NUM
先從
$@
中篩選出來,然後指派。
NUM=`echo "$@" | grep -Eo "\-[0-9]+"`
ARGS=`echo "$@" | sed -nr 's!(.*)-[0-9]+(.*)!\1\2!'p`
eval set -- "$ARGS"