2012-11-12 13 views
7

Non voglio usare tcsh, ma sfortunatamente non ho scelta in questa situazione. Quindi per favore non usare le risposte "usa un'altra shell"!Come verificare se una variabile di ambiente non è impostata o impostata sulla stringa vuota?

Attualmente sto cercando di verificare che sia impostata una variabile di ambiente e che sia impostata su qualcosa di utile. Quindi quello che voglio fare è questo:

if ($?HAPPYVAR && $HAPPYVAR != "") then 
    ... blah... 
else if ($?SADVAR && $SADVAR != "") then 
    ... more blah ... 
endif 

Il problema è che se $ HAPPYVAR è impostata, sarà errore fuori sulla seconda metà della espressione (perché l'ambiente sostituzione di variabile accade in anticipo). Potrei usare if if annidati, ma poi avrei problemi a far funzionare correttamente il mio "else" (dovrei impostare un altro env var per dire se "... blah ..." è successo o meno).

Qualcuno ha una soluzione carina e ordinata per fare questo?

+0

mentre si lavora sullo stesso concetto ho scoperto che il mio script non processa se il blocco, semplicemente dice che HAPPYVAR: variabile indefinita e termina, come posso farlo funzionare in modo che venga eseguito se blocco? –

risposta

5

C'è probabilmente un modo più bello, ma è possibile utilizzare eval per ritardare l'esecuzione:

if ($?HAPPYVAR && {eval 'test ! -z $HAPPYVAR'}) then 
    ... blah... 
else if ($?SADVAR && {eval 'test ! -z $SADVAR'}) then 
    ... more blah ... 
endif 

Questo sembra funzionare per le vostre esigenze.

Se test non funziona o si, questo funzionerà anche:

if ($?HAPPYVAR && { eval 'if ($HAPPYVAR == "") exit 1' }) then 

Ah, csh.

+0

Non è la soluzione elegante che speravo, ma sicuramente funzionerebbe. Se qualcuno conosce una soluzione più carina, sono tutto orecchie. – spookypeanut

Problemi correlati