2015-07-01 14 views
6

Mi aspetto di utilizzare la variabile seguente nel mio script bash, ma nel caso in cui questo sia vuoto o nullo, quale sarebbe il modo migliore per gestirlo ed uscire dallo script.Script di shell - script di uscita se la variabile è nullo o vuota

tag=$1 

Sto vedendo le risposte con 'set -u'. So che funzionerà, ma è buono per l'ambiente di produzione?

+1

http://mywiki.wooledge.org/BashGuide/TestsAndConditionals#Conditional_Blocks_.28if.2C_test_and_.5B.5B.29 –

+0

caso una variabile costituita da spazi bianchi solo in questo modo: 'var =" "' essere considerato vuoto o no? –

+0

sì, variabile costituita da spazi bianchi, considerata vuota. fondamentalmente, sto pensando di mettere un assegno come se [[! -z "$ {Tag}" && "$ {Tag}"! = '']] per questo. –

risposta

17

Esiste un operatore incorporato per richiedere che sia impostata una variabile. Ciò causerà l'uscita dallo script se non lo è.

tag=${1?Need a value} 

Comunemente questo viene utilizzato con il : no-op vicino all'inizio dello script.

: ${1?Need a value} 

La combinazione di "non impostato o vuoto" è leggermente diversa. Non esiste un costrutto simile per uscire su un valore vuoto ma impostato, ma è possibile utilizzare facilmente la sintassi relativa ${var:-default} che si espande in $var se è impostato e non vuoto, e default in caso contrario. C'è anche ${var-default} che produce solo default se la variabile è correttamente disinserita.

Questo può essere particolarmente utile quando si desidera utilizzare set -u ma necessario per far fronte a una variabile, eventualmente impostata:

case ${var-} in '') echo "$0: Need a value in var" >&2; exit 1;; esac 

ho un po 'preferisco case sopra if [ "${var-}" = '' ], soprattutto perché mi evita di dover avvolgere doppi apici intorno a ${var-} e il fastidioso caso di un valore in $var che viene interpretato come un'opzione a [ e ti dà un messaggio di errore quando meno te l'aspetti. (In Bash, [[ non ha questi problemi, ma preferisco di attenersi a shell POSIX quando posso.)

10

Se si desidera verificare che una variabile non è vuoto, si può fare questo:

if [ -z "$tag" ]; then 
    exit 1 
fi 

Dal manuale per test:

-z STRING

la lunghezza di STRING è zero

Dato che si sta utilizzando il p argomenti di tipo osale allo script, puoi anche verificare il numero di argomenti che ricevi guardando a $#.

+2

Hai bisogno di virgolette intorno a "" $ tag "' o questo non funziona su una stringa vuota (provalo e vedi). –

+0

@EtanReisner ringraziamenti! aggiornato –

1

Non sono sicuro se si desidera rilevare se una variabile è unset o empty. Queste sono 2 cose diverse.In particolare, una variabile può essere impostata ma essere vuota:

$ var="" 
$ if [ -z "$var" ]; then echo empty; fi 
$ empty 

Lo stesso sta succedendo qui:

#!/usr/bin/env bash 

set -u 
echo $1 

prova:

$ ./test.sh 
./test.sh: line 4: $1: unbound variable 
$ ./test.sh "" 

$ 

O qui:

#!/usr/bin/env bash 

tag=${1?Need a value} 
echo $tag 

Test:

$ ./se.sh 
./se.sh: line 3: 1: Need a value 
$ ./se.sh "" 

$ 

Altri poster hanno presentato i modi corretti per rilevare una variabile vuota e non impostata. Personalmente mi piace questo modo di rilevamento variabili vuote e non impostate:

#!/usr/bin/env bash 

if [ "$1"A = A ] 
then 
    echo variable is empty or unset 
fi 

Test:

$ ./empty.sh "" 
variable is empty or unset 
$ ./empty.sh 
variable is empty or unset 
$ ./empty.sh 1 
$ 
+1

Il metodo '" $ 1 "A' non è necessario in alcuna implementazione di shell moderna e remota. Quello era un trucco necessario per le vecchie shell che non potevano gestire argomenti esplicitamente vuoti per il comando 'test'. '[" $ 1 "=" "]' può gestire anche un '$ 1 vuoto/non impostato '. – chepner

+0

Non è necessario, ma ancora, mi piace. È una questione di preferenze personali. –

0

Usa pattern matching per rilevare se il valore consiste soltanto di spazi bianchi:

pattern=$'*(|\t)' 
if [[ $1 = $pattern ]]; then 
    echo "First parameter has no non-whitespace characters" 
    exit 1 
fi 

Il $'...' la citazione rende più semplice aggiungere una tabulazione alla stringa. Il modello esteso *(...) corrisponde a 0 o più i motivi all'interno delle parentesi (simile alla regex (|\t)*). Il modello è assegnato a una variabile perché = esegue la corrispondenza esatta della stringa se viene citata una parte del suo operando a destra, quindi eseguiamo preventivamente la quotatura per rendere più semplice l'impostazione del valore.

+0

È necessario abilitare il globbing esteso perché funzioni, non è vero? – tripleee

+0

Forse. Le versioni più recenti di 'bash' (4.2 e successive?) Trasformano temporaneamente globbing esteso all'interno di' [[...]] 'quindi non c'è bisogno di farlo in modo esplicito. Altrimenti, sì, è necessario 'shopt -s extglob'. – chepner

1

Mi è piuttosto piaciuto come Perl usi "die" ed è facile fare qualcosa di simile nella shell.

# Print (optional) error message and exit 
# Usage: die [[msg] exit_status] 
die() { 
    [[ -n "$1" ]] && echo "$1" 
    [[ -n "$2" ]] && exit $2 || exit 1 
} 

[[ -n "$tag" ]] || die "Need a tag argument. Use $0 --help for details" 

Ciò presuppone bash o shell Korne, ma può essere convertito in shell Borne classico cambiando [[]] a [].

0

Il seguente test garantisce che una variabile sia Null o abbia un valore assegnato. Le virgolette doppie sono molto importanti e devono essere utilizzate!

VAL= # Creates a NULL variable 
if [[ -z "$VAL" && "$VAL" = ’’ ]] 
then 
echo "The VAL variable is NULL" 
fi 
or 
VAL=25 
if [[ ! -z "$VAL" && "$VAL" != ’’ ]] 
then 
echo "The VAL variable is NOT NULL" 
fi