簡體   English   中英

當選項前有參數時,getopts不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM