2014-04-07 22 views
5

Ben ubuntu ve bash komut dosyası için oldukça yeni ve GETOPTS kullanırken bu hatayı alıyorum neden bilmek istedim.Yeni - Geçersiz tutmak için yanılma seçeneği hatası

Burada çalıştırmak için kullandığım kod.

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

Komut dosyasını doğru şekilde aradığımı düşünüyorum ve aramayı, terim kullanarak arama terimi olarak girme terimini aramalıyım. ama nedense öyle değil. Grep ile çalışırken genel bir kural olarak neler yapabileceğime dair herhangi bir tavsiye de takdir edilecektir. getopts yılında

#!/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 

cevap

10

Eğer sadece f:d:s:m: seçenek var p seçeneği belirtmez.

yerine m veya bunun tersini kastediyorsunuz.

O f:d:s:m:p: veya f:d:s:p:

+0

Teşekkürler, çok takdir! – Duenna

+0

@Duenna'ya hoşgeldiniz. –

2

Orada Senaryonuzun ile ilgili diğer sorunlar bir çift Jayesh söylediği gibi, başka getopt için tüm parametreleri içermesi gerekir, ama aynı zamanda dize karşılaştırmaları dikkatli olmak gerekir, burada buradan bir kaç olmalıdır önerilerle daha düzeltmeleri:

#!/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

Ayrıca hata supression ve hata işleme özelliklerini dikkate almalıdır (string karşılaştırma bilgi için http://www.tldp.org/LDP/abs/html/comparison-ops.html bakınız) getopts. seçenek dizesinin ilk karakteri bir kolon (:) daha sonra getopts hataları kendiniz ele bir araç sağlayacaktır yerine hataları rapor vereceğini ise

. Geçersiz bir seçenek ardından $opt örneğin geçersiz karakter yapacak ? ve $OPTARG olarak ayarlanır girilirse

  • ?: İki ek karakterler sonra dava koşullu taşıma içinde kullanılabilir -z kullanıldıysa, bu seçenek dizenizde değilse, $OPTARGz olarak ayarlanacaktır.

  • : gerekli ek bağımsız değişken, örneğin komut karakteri düzenleyecek sonra $opt: ve $OPTARG ayarlanır kullanıcı tarafından atlanırsa -p arg yerine -p kullanıldıysa $OPTARGp olarak ayarlanacaktır. Bu daha sonra uygulanması halinde

catch-all * ait gereksiz hale gelir ve kaldırılmalıdır. Not: Eğer onu içeride bırakırsanız ve ? veya :'un üzerindeyse, o zaman sorunlarınız olacaktır. Ayrıca, ?'un bu \?) gibi olduğundan emin olun.

Bu yardımcı olur umarım.

# 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

Eğer '?' Kaçmazsa, o zaman herhangi bir şeyle eşleşir ve asla ':' durumuna ulaşmazsınız, bu yüzden eksik hatalar geçersiz seçenekler olarak bildirilir. –

+0

Açıklama için teşekkürler Mark. Faydalı bilgiler. – mattst

İlgili konular