Bash

檢測 getopts --(雙破折號)以發出消息

  • September 17, 2021

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 並行如何獲取由 分隔的參數列表:::::::

引用自:https://unix.stackexchange.com/questions/666686