簡體   English   中英

為什么我不能使用getopt在選項和可選參數之間有空格?

[英]Why cant I have a space between option and optional argument using getopt?

使用getopt來解析命令行參數時,可以在選項標志和必需參數的參數之間放置一個空格,但不在可選參數之間。 只有在選項之后,才會解析可選參數。

TEMP=`getopt -o p:q:: -n 'mkqueue.sh' -- "$@"`

if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

# Now go through all the options
while true ; do
    case "$1" in
        -p) echo "Option p, argument \`$2'" ; shift 2 ;;
        -q) 
            case "$2" in
                "") echo "Option q, no argument"; shift 2 ;;
                *)  echo "Option q, argument \`$2'" ; shift 2 ;;
            esac ;;
        --) shift ; break ;;
        *) echo "Internal error!" ; exit 1 ;;
    esac
done

(基於此: http//software.frodo.looijaard.name/getopt/docs/getopt-parse.bash

當我運行沒有可選參數的腳本時,它可以工作:

./mkqueue.sh -p adfsa -q
Option p, argument `adfsa'
Option q, no argument

如果我嘗試將可選參數添加到-q並在其間有空格,則它不起作用:

./mkqueue.sh -p adfsa -q sdfasdfa
Option p, argument `adfsa'
Option q, no argument

如果您在選項和參數之間沒有空格,即使必需參數與空間一起使用,它也可以工作:

./mkqueue.sh -p adfsa -qsdfasdfa
Option p, argument `adfsa'
Option q, argument `sdfasdfa'

有沒有解決這個問題?

getopt的聯機幫助頁中記錄了該限制:

一個簡單的短選項是“ - ”后跟一個短選項字符。 如果該選項具有必需參數,則可以直接在選項字符之后或作為下一個參數(即由命令行上的空格分隔)寫入。 如果該選項具有可選參數,則必須在選項字符(如果存在)之后直接寫入。

盡管getopt允許“可選選項參數”,但它們通常被認為是一個壞主意。 例如,Posix 實用程序語法指南包括:

准則7 :選項參數不應是可選的。

本指南的基本原因是按照慣例,命令行選項的參數可以是任何字符串。 例如,它可能看起來像另一種選擇。 它可能是文字字符串--通常表示選項列表的結尾。 它可能是一個空字符串。 任何東西。

“可選選項參數”的問題在於,知道未提供可選選項參數的唯一方法是將以下參數識別為選項或-- 但這意味着可選參數的值不能以-開頭。

或者,您可以選擇getopt命令行實用程序采用的解決方案,即要求可選參數緊跟在該選項之后,而沒有中間空格(即,在同一個單詞中)。 但在這種情況下,可選參數不能是空字符串。

而不是創建復雜的規則來解決這些歧義,Posix推薦的簡單解決方案(並且,我的權限很少) - 是不允許選項參數是可選的。 如果命令行選項有一個共同的值,並且您希望通過不要求輸入來簡化用戶的生命周期,那么實現兩個不同的命令行選項,其中一個選擇參數,另一個選擇參數沒有。 常用技術包括對不帶參數的版本使用小寫字符,對帶有參數的版本使用相應的大寫字符,或者對該版本使用長選項( --option )。

對於那些喜歡密集和有說服力的解釋的人,Posix的理由解釋說:

准則7允許任何字符串作為選項參數; option-argument可以以任何字符開頭,可以是--- ,也可以是空字符串。 例如,命令pr -h -pr -h --pr -h -dpr -h +2pr -h ''包含選項 - 參數----- -d+2 ,和一個空字符串。 相反,命令pr -h -- -d將-d視為一個選項,而不是參數,因為--這里的--是一個選項參數,而不是分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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