處理標誌和可選引數

內建的 getopts 可以在函式內部用於編寫容納標誌和可選引數的函式。這沒有特別的困難,但是必須適當地處理 getopts 所觸及的值。作為一個例子,我們定義了一個 failwith 函式,它在 stderr 上寫入訊息並以程式碼 1 或作為引數提供給 -x 選項的任意程式碼退出:

# failwith [-x STATUS] PRINTF-LIKE-ARGV
#  Fail with the given diagnostic message
#
# The -x flag can be used to convey a custom exit status, instead of
# the value 1.  A newline is automatically added to the output.

failwith()
{
    local OPTIND OPTION OPTARG status

    status=1
    OPTIND=1

    while getopts 'x:' OPTION; do
        case ${OPTION} in
            x)    status="${OPTARG}";;
            *)    1>&2 printf 'failwith: %s: Unsupported option.\n' "${OPTION}";;
        esac
    done

    shift $(( OPTIND - 1 ))
    {
        printf 'Failure: '
        printf "$@"
        printf '\n'
    } 1>&2
    exit "${status}"
}

該功能可以如下使用:

failwith '%s: File not found.' "${filename}"
failwith -x 70 'General internal error.'

等等。

請注意,對於 printf ,變數不應該用作第一個引數。如果要列印的訊息由變數的內容組成,則應使用%s 說明符列印它,如

failwith '%s' "${message}"