[英]getopts doesn't work when there are arguments before options
當我像這樣運行命令時:
$: ./script -r f1 f2
:
它檢測到“ -r”標志並將遞歸標志設置為1。
$: ./script directory/ -r
:
getopts
根本不檢測-r
標志。 因此,在case語句中,它永遠不會檢測到-r
標志,因此while循環甚至根本不會運行。 如何解決?
RECURSIVE_FLAG=0
while getopts ":rR" opt ; do
echo " opt = $opt"
set -x
case "$opt" in
r) RECURSIVE_FLAG=1 ;;
R) RECURSIVE_FLAG=1 ;;
:)echo "not working" ;;
*)echo "Testing *" ;;
esac
done
它與斜杠無關。 當getopts
到達第一個不以-
開頭的參數時,它將停止處理選項。 這是記錄的行為:
當遇到選項結尾時,
getopts
退出且返回值大於零。OPTIND
設置為第一個非選項參數的索引, 名稱設置為?
。
您聲稱它在您使用時有效
./script f1 f2 -r
是完全錯誤的。 我在腳本的末尾添加了echo $RECURSIVE_FLAG
,當我以這種方式運行它時,它回顯了0
。
如果要允許使用更自由的語法,請在文件名后加上選項(例如GNU rm
),則需要自己進行一些參數解析。 將您的getopts
循環放入另一個循環中。 當getopts
循環完成時,您可以執行以下操作:
# Find next option argument
while [[ $OPTIND <= $# && ${!OPTIND} != -* ]]; do
((OPTIND++))
done
# Stop when we've run out of arguments
if [[ $OPTIND > $# ]]; then
break
fi
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.