2013-02-20 35 views
8

Ho uno script in cui ho bisogno di visualizzare il comando di utilizzo nel caso in cui l'utente manchi qualsiasi informazione obbligatoria durante l'esecuzione dello script.Aggiungere contenuto di utilizzo nello script della shell senza getopts

Usage : Script -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value> 

con la spiegazione di tutti i valori OPTIONS

che sto ricevendo da argomenti di seguito le variabili della moda. Ma voglio questo uso con le convalide nello script di shell.

SERVER=$1 
INSTANCE=$2 
USER=$3 
DB_PASSWD=$4 
QUERY=$5 
VAL_WARN=$6 
VAL_CRIT=$7 

Ho provato con getopts, ma non è riuscito a usare poiché <query> non ha un parametro -q prima di passare il valore.

Ho provato a trovare tutti gli altri modi, ma tutti hanno suggerito getopts che non è una soluzione fattibile per me.

please help me su questo ..

+1

Uno dei meriti delle lettere di opzione è che consente all'utente di inserire gli articoli in qualsiasi ordine. Se l'ordine è corretto, non è necessario preoccuparsi di opzioni come '-s'; ciò rende semplicemente l'utente di tipo extra per sostanzialmente nessun beneficio. Prendo atto che la stringa del server è '$ 2' (non' $ 1') nella riga di comando grezza. Non puoi regolarizzare il tuo comando in modo che '-q' sia necessario, o in modo che la query sia l'ultimo argomento? Qualcuna delle opzioni ha impostazioni predefinite corrette? Se è così, usali invece di chiedere che un utente digiti 13 argomenti. I tuoi utenti ti ringrazieranno e il tuo script sarà più facile da scrivere. –

risposta

20

Usa spostamento per scorrere attraverso tutte le argomentazioni, qualcosa come:

#!/bin/sh 

usage() 
{ 
    echo 'Usage : Script -s <server> -i <instance> -u <user> -p <password>' 
    echo '     <query> -w <warning value> -c <critical value>' 
    exit 
} 

if [ "$#" -ne 13 ] 
then 
    usage 
fi 

while [ "$1" != "" ]; do 
case $1 in 
     -s)   shift 
         SERVER=$1 
         ;; 
     -i)   shift 
         INSTANCE=$1 
         ;; 
     -u)   shift 
         USER=$1 
         ;; 
     -p)   shift 
         PASSWORD=$1 
         ;; 
     -w)   shift 
         WARNINGVAL=$1 
         ;; 
     -c)   shift 
         CRITICVAL=$1 
         ;; 
     *)   QUERY=$1 
    esac 
    shift 
done 

# extra validation suggested by @technosaurus 
if [ "$SERVER" = "" ] 
then 
    usage 
fi 
if [ "$INSTANCE" = "" ] 
then 
    usage 
fi 
if [ "$USER" = "" ] 
then 
    usage 
fi 
if [ "$PASSWORD" = "" ] 
then 
    usage 
fi 
if [ "$QUERY" = "" ] 
then 
    usage 
fi 
if [ "$WARNINGVAL" = "" ] 
then 
    usage 
fi 
if [ "$CRITICVAL" = "" ] 
then 
    usage 
fi 

echo "ALL IS WELL. SERVER=$SERVER,INSTANCE=$INSTANCE,USER=$USER,PASSWORD=$PASSWORD,QUERY=$QUERY,WARNING=$WARNINGVAL,CRITIC=$CRITICVAL" 

dovrebbe fare il trucco.

EDIT: aggiunto la convalida degli argomenti nello script come suggerito da @technosaurus

+0

ha solo bisogno di controlli alla fine '[! "$ PASSWORD"] && usage' # e simili per altri argomenti obbligatori – technosaurus

+0

@technosaurus AFAICS che il controllo è già presente: 'while [" $ 1 "! =" "] ...' –

+0

funzionerebbe ancora' Script q q q q q q q q q q q q q' e nessuno dei valori richiesti verrebbe impostato – technosaurus

1

getopts è bitching per un good reason. dovresti cambiare l'interfaccia del tuo script per conformarti a ciò che le persone si aspettano.

in alternativa, è possibile utilizzare getopts due volte, prima per le opzioni pre , shift, quindi per il resto.

1

provare questo

usage() 
{ 
    echo "$0 -s <server> -i <instance> -u <user> -p <password> <query> -w <warning value> -c <critical value>" 
} 

for i in {0..12} 
do 
    arg=`expr $i +1` 
    test ! "${!arg}" && usage && break 
done 

speranza che questo aiuta

+1

oppure potresti 'per i in {1..13}' e liberarti della subshell. –

0

Questo è un approccio non-standard, ma che trovo molto utile. Invece di passare valori come argomenti a flag specifici (che è abbastanza fastidioso, l'utente non dovrebbe essere obbligato a specificare ogni valore ma devono essere forniti valori di default ragionevoli), puoi semplicemente passarli direttamente tramite l'ambiente, in modo che una tipica chiamata possa apparire Mi piace:

Sarebbe bello se si usasse il nome della variabile minuscola in modo che l'utente non debba urlare. Ciò consente allo script di evitare semplicemente di analizzare completamente la riga di comando, poiché i valori delle variabili verranno impostati all'avvio dello script.

Problemi correlati