2013-04-20 8 views
7

Ich habe getopts vor kurzem verwendet und ich habe alles eingerichtet. Ich habe ein Problem. Ich mag es so arbeiten, dass, wenn jemand nicht ein Argument in der Befehlszeile eingeben, sie den Hilfetext zu erhalten, z.B .:Wie Hilfetext angezeigt wird, wenn keine Argumente übergeben werden

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

Hier ist, was ich im Moment habe.

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

Antwort

9

Validate Benutzereingabe ein, wenn der Test wie unten.

Die Option -z von test gibt true zurück, wenn die Länge der Zeichenfolge, die auf -z folgt, Null ist.

+0

Vielen Dank auch, Sir! – user2298964

+0

Es ist ein Randfall, aber erwähnenswert: Ihre Bedingung wird auch als wahr ausgewertet, wenn "$ 1" _was_ übergeben wurde, aber als _empty-Zeichenfolge_; z. B. './script '' und' ./script '' foo 'würde immer noch den Hilfetext anzeigen. – mklement0

5

Gilles Quenot's answer funktioniert gut und ist sehr prägnant; wenn Sie nach Lösungen suchen, die die Absicht ausdrücken expliziten, können Sie versuchen diese, die auf der Zählung von Parametern basieren, $#:

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

Alternative, mit arithmetischen Ausdrücken:

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

Schließlich Kurzschrift, die falsch auf 0 Bewertung beruht, und eine beliebige Zahl ungleich Null auf true:

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

William Pursell bietet eine weitere Variante, die sowohl beschreibend und POSIX-konform:

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

test/[ ... ] ist ein POSIX Mehrzweck-/eingebaut, wohingegen die ähnlichen [[ ... ]] bedingte bash -spezifische (wie ((...)) ist).
Im Allgemeinen jedoch bash 's [[ ... ]] bietet mehr Funktionen und hat weniger Überraschungen als test/[...].

Verwandte Themen