0
bash getopts應允許選項和參數不取決於位置,如tutorials和docs中所述。bash getopts忽略選項,除非以某種方式指定
下面的代碼片段可以接收兩個選項:
這需要一個參數- 調試-d選項。
我看到奇怪的行爲,只有列出的第一個選項得到正確處理。
#!/bin/bash
## Defaults
DEBUG=INFO
forceOption=FALSE
## Usage
printUsage() {
echo " "
echo "USAGE: $0 [-d <DEBUG_LEVEL>] [ -f ]"
echo " "
exit 1
}
#
## Manage options before start
#
while getopts "hfd:" OPT
do
case $OPT in
h) printUsage ;;
f) forceOption="TRUE" ;;
d) debugLevel="$OPTARG" ;;
*) printUsage ;;
esac
shift `expr $OPTIND - 1`
done
if [ -n "$debugLevel" ] ; then
DEBUG="$debugLevel"
fi
echo "DEBUG : $DEBUG"
echo "Force : $forceOption"
你可以看到下面的錯誤行爲:
[rgulia$ ~] ./getopts.sh -d WARNING -f
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -f -d WARNING
DEBUG : INFO
Force : TRUE
代碼正確分析時的選項都單獨使用或者-f在選擇和他們的名單之前-d相互連接
[rgulia$ ~] ./getopts.sh -f
DEBUG : INFO
Force : TRUE
[rgulia$ ~] ./getopts.sh -d WARNING
DEBUG : WARNING
Force : FALSE
[rgulia$ ~] ./getopts.sh -fd WARNING
DEBUG : WARNING
Force : TRUE
我的印象是循環太早退出b因爲它在選項傳遞參數時無法正確計算OPTIND。
我用printf語句對OPT,OPTARG和OPTIND的值做了一些跟蹤,證實了這樣的理論,但我仍然不明白爲什麼會發生,以及如何解決它。
有什麼建議嗎?
你是對的!有用。我想我一直誤解了OPTIND的含義。所以,getopts會跟蹤循環中讀取的選項和參數,而OPTIND的遞減只是讓該shell知道一旦-d和-f被處理後,arg向量中剩下多少個參數,對吧? – rgulia
是的。 個人我已經停止使用getopts風格的參數。 它被設計成簡潔(在「複製」時間過長的時候,因此「cp」),並且當大多數其他主要操作系統(MSDOS,VMS,RSTS)使用 'command/option = value ...「 #但是Unix在路徑名中使用了「/」,所以它切換到'-o value'。對於'option = value'形式的字符串掃描args []非常容易(在腳本和程序中)使用環境中設置的參數默認值。My 2c – Mischa
非常感謝您的解釋! – rgulia