2014-04-07 12 views
5

Tôi khá mới đối với tập lệnh ubuntu và bash và muốn biết tại sao tôi có thể gặp phải lỗi này khi sử dụng GETOPTS.mới đối với Bash - tiếp tục nhận được lỗi tùy chọn bất hợp pháp

đây là mã tôi sử dụng để chạy.

sh /home/ubuntu/Desktop/test.sh -f /home/u/Desktop/ -p 'TEST' 

Tôi nghĩ tôi đang gọi tập lệnh chính xác và nên tìm cụm từ tôi nhập làm cụm từ tìm kiếm bằng grap. nhưng vì lý do nào đó thì không. Bất kỳ lời khuyên nào về những gì tôi có thể làm như một quy tắc chung khi làm việc với grep cũng sẽ được đánh giá cao, cảm ơn.

#!/bin/bash 

valid=0 
file_arg="" 
display_help="" 
column="" 
pattern="" 

while getopts f:d:s:m: opt 
do 
    case "$opt" in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 
     *) valid=1 
      break 
      ;; 
    esac 
done 

if [ $valid -eq "0" ] 
then 
    if [ $pattern != "" ] 
    then 
     cat $file_arg | grep $pattern 
    else 
     cat $file 
    fi 
else 
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>" 
fi 

Trả lời

10

Trong getopts bạn không chỉ định p tùy chọn mà bạn chỉ có f:d:s:m: tùy chọn.

Tôi nghĩ bạn có nghĩa là p thay vì m hoặc ngược lại.

Cần f:d:s:m:p: hoặc f:d:s:p:

+0

Cảm ơn người đàn ông, được nhiều người đánh giá cao! – Duenna

+0

@Duenna bạn được chào đón. –

2

Có một vài vấn đề khác với kịch bản của bạn, như Jayesh đề cập, bạn cần phải bao gồm tất cả các thông số cho getopt nhưng bạn cũng cần phải cẩn thận với những so sánh chuỗi, đây là một cặp vợ chồng hơn các bản sửa lỗi với gợi ý:

(Xem http://www.tldp.org/LDP/abs/html/comparison-ops.html để biết chuỗi so sánh)

#!/bin/bash 

# switch around valid, convention is 1 == true and 0 == false 
valid=1 
file_arg="" 
display_help="" 
column="" 
pattern="" 

# getopt patterns need to match following case statement 
while getopts f:d:c:p: opt; 
do 
    case $opt in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 
     *) valid=0 
      break 
      ;; 
    esac 
done 

# changed value to reflect true false convention 
if [ "$valid" -eq "1" ] 
then 
    # string comparison in bash should be done using specific operators 
    if [ -n "$pattern" ] 
    then 
     cat $file_arg | grep $pattern 
    else 
     # typo, this should be file_arg? 
     cat $file_arg 
    fi 
else 
    echo -n "Usage: FILE -f <name> | COLUMN -> -c <name> | HELP -> -d | PATTERN -> -p <expression>" 
fi 
3

Bạn cũng nên xem xét các tính năng supression lỗi và xử lý lỗi của getopts.

Nếu nhân vật đầu tiên của chuỗi tùy chọn là một dấu hai chấm (:) sau đó getopts sẽ không báo cáo lỗi và thay vào đó sẽ cung cấp một phương tiện để xử lý các lỗi chính mình. Hai ký tự bổ sung sau đó có thể được sử dụng trong trường hợp xử lý điều kiện của bạn:

  • ? Nếu một tùy chọn không hợp lệ được nhập sau đó $opt sẽ được thiết lập để ?$OPTARG sẽ tổ chức các nhân vật không hợp lệ, ví dụ nếu -z đã được sử dụng, không có trong chuỗi tùy chọn của bạn, thì $OPTARG sẽ được đặt thành z.

  • : Nếu một cuộc tranh luận bổ sung cần được bỏ qua bởi người sử dụng sau đó $opt sẽ được thiết lập để :$OPTARG sẽ tổ chức các nhân vật chỉ huy, ví dụ nếu -p đã được sử dụng thay vì -p arg thì $OPTARG sẽ được đặt thành p.

Nếu điều này được triển khai thì toàn bộ * trở nên thừa và cần được loại bỏ. Lưu ý: Nếu bạn để nó ở trong và nó ở trên hoặc là ? hoặc : thì bạn sẽ hỏi về các sự cố. Ngoài ra, hãy đảm bảo rằng ? được thoát như thế này \?).

Hy vọng điều này sẽ hữu ích.

# Note the addition of the inital colon before 'f'. 
while getopts :f:d:c:p: opt; 
do 
    case $opt in 
     d) display_help=$OPTARG 
      ;; 
     f) file_arg=$OPTARG 
      ;; 
     c) column=$OPTARG 
      ;; 
     p) pattern=$OPTARG 
      ;; 

     # Option error handling. 

     \?) valid=0 
      echo "An invalid option has been entered: $OPTARG" 
      ;; 

     :) valid=0 
      echo "The additional argument for option $OPTARG was omitted." 
      ;; 

     # This is now redundant: 
     # *) valid=0 
     #  break 
     #  ;; 
    esac 
done 
+1

Nếu '?' Không được thoát, thì nó khớp với bất kỳ thứ gì và bạn không bao giờ nhận được trường hợp ':', vì vậy, các tham số bị thiếu được báo cáo là các tùy chọn không hợp lệ. –

+0

Cảm ơn Mark đã làm rõ. Kiến thức hữu ích. – mattst

Các vấn đề liên quan