[英]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 -d
,pr -h +2
和pr -h ''
包含選項 - 參數-
,--
,--
-d
,+2
,和一個空字符串。 相反,命令pr -h -- -d
將-d視為一個選項,而不是參數,因為--
這里的--
是一個選項參數,而不是分隔符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.