天天看點

shell程式設計——如何實作指令行選項的各種個性功能如何實作指令行選項的各種個性功能

如何實作指令行選項的各種個性功能

在前面

指令行選項的那些事

中介紹了幾種有"個性"的選項功能,包括:

  • 選項依賴:例如"-a"或"--add"要依賴于"-m"或"--manage"選項
  • 選項互斥:例如"-a"或"--add"與"-r"或"--remove"是互斥的
  • 識别負數參數:例如

    -w -5 -3 5

    ,其中-5和-3不是短選項,而是負數參數
  • 模式化選項:例如

    script_name MODE OPTIONS

    的MODE部分,可以是manage模式(--manage,-m),也可以使用add模式(--add,-a)
  • 選項參數替代選項:例如

    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"