如果嘗試移動多於列表中存在的值,shift n
命令不會執行任何操作。這就是代碼中無限循環的原因。
使用getopts
是正確的選擇,因爲它爲您提供了很大的靈活性。否則,你可以這樣改寫你的循環:
#!/bin/bash
# Parse command line input
d_flag=0
b_flag=0
while [ "$#" -gt 0 ]; do
case "$1" in
-d)
d_flag=1
shift
[[ $1 == -* ]] && continue # argument to -d not given
DOMAIN=$1
shift
;;
-b)
b_flag=1
shift
[[ $1 == -* ]] && continue # argument to -b not given
BITS=$1
shift
;;
*) echo "unrecognized argument: $1"; exit 2;;
esac
done
if [[ $d_flag = 1 && -z $DOMAIN ]]; then
# handle error - option requires an argument
fi
if [[ $b_flag = 1 && -z $BITS ]]; then
# handle error - option requires an argument
fi
如果您的參數只是單個字母,您可以使用['getopts'](https://www.gnu.org/software/bash/manual/bashref.html#index-getopts),而不是滾動自己的。 –
一個可行的技巧,特別是如果你有一些標誌選項(不帶參數),在'case'內部是'shift'而不是'shift 2',而'esac'後面是'shift',' done'。旗幟選項根本不需要轉換。因爲它會一次移動一個參數,所以它會擺脫一個沒有參數的'-b',所以循環會終止。也就是說,'getopts'答案是更好的長期選擇。臨時解決方案獲取臨時錯誤 - 見證你的無限循環問題。 –