Bash檢測 getopts
檢測 getopts --
(雙破折號)以發出消息
我
getopts
通過一個名為arg
. 我可以如下擷取選項名稱。是否可以檢測到 getopts 到達“–”的時刻以便我可以發出消息?while getopts "$shortopts" arg; do echo "--> arg: $arg" case $arg in ("V") printf '%s\n' "Version" return ;; ("u") printf '%s\n' "Usage" return ;; ("h") printf '%s\n' "Help" return ;; esac done
是否可以檢測到 getopts 到達“–”的時刻以便我可以發出消息?
你不應該需要。
getopts``--
實現標準選項處理,這意味著當它看到一個不是選項的參數時,或者如果它看到顯式終止選項列表的參數時,它會停止尋找選項。(第一點與在整個命令行上查找選項的 GNU 自定義不同。)程序不需要關心會議
--
。也就是說,由於
getopts
不會丟棄位置參數列表,您可以在那裡查看最後一個參數是否為--
.#!/bin/bash while getopts a:bc opt; do echo "option $opt arg $OPTARG" done last= if [ "$OPTIND" -ge 2 ]; then shift "$((OPTIND - 2))" last=$1 shift 1 else shift "$((OPTIND - 1))" fi if [ "$last" = "--" ]; then echo "options were terminated by a double-dash (or last arg was an option-argument '--')" fi echo "remaining args: $*"
那會給例如
$ bash opts.sh -a blah -- -b foo option a arg blah options were terminated by a double-dash (or last arg was an option-argument '--') remaining args: -b foo
但由於它只查看最後一個參數,它可以是
--
分隔符,也可以是--
某個選項的選項參數。例如,這是誤報,--
這裡不是分隔符:$ bash opts.sh -a -- foo option a arg -- options were terminated by a double-dash (or last arg was an option-argument '--') remaining args: foo
當然,您也可以實現自己的選項處理,但是這樣做有點煩人,因為 shell 使處理子字元串變得很尷尬。(您需要將其辨識
-abc
為三個不同的選項,或者一個或兩個,這取決於是否-a
或-b
採用選項參數。)無論如何,除非你做的事情比通常需要的複雜得多,否則不應該有任何理由去查看
--
. 即使你做一些更複雜的事情,你也可以考慮在外面做getopts
(和另一個分隔符),類似於如何find
給出表達式,或者 GNU 並行如何獲取由 分隔的參數列表:::
等::::
。