處理標誌和可選引數
內建的 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}"