Khi sử dụng getopt để phân tích cú pháp tham số dòng lệnh, bạn có thể đặt dấu cách giữa cờ tùy chọn và đối số cho đối số bắt buộc nhưng không đặt cho đối số tùy chọn. Các đối số tùy chọn sẽ chỉ được phân tích cú pháp nếu chúng nằm ngay sau tùy chọn.Tại sao tôi không thể có khoảng cách giữa tùy chọn và đối số tùy chọn bằng cách sử dụng getopt?
TEMP=`getopt -o p:q:: -n 'mkqueue.sh' -- "[email protected]"`
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
(Dựa trên điều này: http://software.frodo.looijaard.name/getopt/docs/getopt-parse.bash)
Khi tôi chạy kịch bản mà không có đối số tùy chọn hoạt động:
./mkqueue.sh -p adfsa -q
Option p, argument `adfsa'
Option q, no argument
Nếu tôi cố gắng thêm đối số tùy chọn để -q với một không gian ở giữa nó không hoạt động:
./mkqueue.sh -p adfsa -q sdfasdfa
Option p, argument `adfsa'
Option q, no argument
Nó hoạt động nếu bạn không có tốc độ ở giữa tùy chọn và đối số, mặc dù đối số bắt buộc hoạt động với không gian:
./mkqueue.sh -p adfsa -qsdfasdfa
Option p, argument `adfsa'
Option q, argument `sdfasdfa'
Có khắc phục sự cố này không?
Nếu được phép, bạn sẽ gặp phải sự cố khác. Giả sử chương trình của bạn cũng chấp nhận một đối số vị trí. Nên './a.out -q foo bar' được phân tách thành' ./a.out -qfoo bar' hoặc là './a.out -q - foo bar'? – 5gon12eder
@ 5gon12eder, nếu bạn có câu trả lời như vậy, bạn ít nhất cũng có ý kiến của tôi. Nó giải thích "tại sao", đó là tiêu đề của câu hỏi này yêu cầu. :) –