2012-09-04 20 views
76

Attualmente sto scrivendo un framework di test di bash, in cui in una funzione di test possono essere utilizzati sia i test di bash standard ([[) che gli abbinamenti predefiniti. I matcher sono wrapper di '[[' e oltre a restituire un codice di ritorno, imposta un messaggio significativo che dice cosa ci si aspettava.Utilizzo di unset e impostazione di una variabile a vuoto

Esempio:

string_equals() { 
    if [[ ! $1 = $2 ]]; then 
      error_message="Expected '$1' to be '$2'." 

      return 1 
    fi 
} 

Così, quando viene utilizzato un matcher, e non riesce, solo allora un error_message è impostato.

Ora, a un certo punto, ho verificato se i test hanno avuto esito positivo. Se è riuscito, stampo l'aspettativa in verde, se non è riuscita in rosso.

Inoltre, ci può essere un insieme error_message, quindi verificare se esiste un messaggio, stamparlo, e quindi non impostato (perché il seguente test non può impostare un error_message):

if [[ $error_message ]]; then 
    printf '%s\n' "$error_message" 

    unset -v error_message 
fi 

Ora la mia domanda è, se è meglio disinserire la variabile, o semplicemente impostarla su "", come

error_message='' 

Quale è meglio? In realtà fa la differenza? O forse dovrei avere una bandiera aggiuntiva che indica che il messaggio è stato impostato?

+1

Se non si confronta mai 'error_message' con qualcos'altro, direi che non importa. Comunque, penso che tu voglia '[[$ error_message]]', altrimenti stai testando che esiste la stringa letterale "error_message". – chepner

+0

@chepner Sì, era un refuso. Aggiustato. – helpermethod

risposta

108

Per lo più non si vede la differenza, a meno che non si sta utilizzando set -u:

/home/user1> var="" 
/home/user1> echo $var 

/home/user1> set -u 
/home/user1> echo $var 

/home/user1> unset var 
/home/user1> echo $var 
-bash: var: unbound variable 

Quindi, in realtà, dipende da come si sta andando a testare la variabile.

aggiungo che il mio modo preferito di test se impostato è:

[[ -n $var ]] # True if the length of $var is non-zero 

o

[[ -z $var ]] # True if zero length 
+31

'var =' non è "non impostato". È solo una stringa vuota senza virgolette. Oltre a 'set -u', le varie forme di espansione dei parametri di bash possono anche distinguere tra valori unset e null:' $ {foo: bar} 'si espande a" bar "quando' foo' non è impostato, ma "" quando 'foo 'è nullo, mentre' $ {pippo: -bar} 'si espande in" bar "se foo non è impostato o è nullo. – chepner

+0

'[[-n $ var]]' è false se 'var' è impostato sulla stringa vuota. – chepner

+0

@chepner: OK, questo è quello che intendevo, farò una modifica. – cdarke

10

Come si è detto, utilizzando disinserimento è diverso con multidimensionali

$ foo=(4 5 6) 

$ foo[2]= 

$ echo ${#foo[*]} 
3 

$ unset foo[2] 

$ echo ${#foo[*]} 
2 
Problemi correlati