2013-04-20 11 views
7

Używam ostatnio getopts i wszystko ustawiłem. Mam jednak problem. Chcę go do pracy tak, że jeśli ktoś nie wejdzie argument w linii poleceń, dostają tekst pomocy, np .:Jak wyświetlić tekst pomocy, jeśli żadne argumenty nie są przekazywane

$ ./script 
$ help: xyz - argument must be used. 

Oto co mam w tej chwili.

#!/bin/bash 

function helptext { 
    # ... 
} 

function mitlicense { 
    # ... 
} 


while getopts "hl" opt; do 
    case $opt in 
    h) helptext >&2 
     exit 1 
    ;; 
    l) mitlicense >&2 
     exit 0 
    ;; 
    \?) echo "Invalid option: -$OPTARG" >&2 
     exit 1 
    ;; 
    :) echo "Option -$OPTARG requires an argument." >&2 
     exit 1 
    ;; 
    *) helptext >&2 
     exit 1 
    ;; 
    esac 
done 

Odpowiedz

9

wejściowe użytkownika Weryfikuj stosując Jeśli test, taki jak poniżej.

Opcja -z z test zwraca wartość true, jeśli długość ciągu następującego po -z wynosi zero.

if [ -z "$1" ] 
then 
    helptext 
    exit 1 
fi 
+0

Dziękuję też panu! – user2298964

+0

Jest to poważny przypadek, ale warto wspomnieć: twoja uwarunkowana wartość również jest prawdziwa, jeśli "$ 1" minęło, ale jako _tyty ciąg_; np. "./script" "i" ./script "" foo "nadal wyświetlają tekst pomocy. – mklement0

5

Gilles Quenot's answer działa świetnie i jest bardzo zwięzły; jeśli szukasz rozwiązań, które wyrażają intencję bardziej wyraźnie, można spróbować te, które oparte są na liczbie parametrów , $#:

[[ $# -gt 0 ]] || { helptext; exit 1; } 

Alternatywa, używając wyrażeń arytmetycznych:

(($# > 0)) || { helptext; exit 1; } 

Wreszcie, skrótem, który opiera się na 0 oceny na false, a każda niezerowa liczba true:

(($#)) || { helptext; exit 1; } 

William Pursell oferuje inny wariant, który jest zarówno opisowy i POSIX:

test $# -gt 0 || { helptext; exit 1; } 

test/[ ... ] to narzędzie POSIX/wbudowany, podczas gdy podobna [[ ... ]] uwarunkowane jest bash -specyficznych (jak ((...))).
Ogólnie jednak bash oferuje więcej funkcji i ma mniej niespodzianek niż test/[...].

Powiązane problemy