Perché si diventa sempre vero? Giochiamo un po 'prima al terminale:
$ [[ hello ]] && echo "True"
Quale pensi che sia l'uscita? (provalo!) E con il seguente?
$ [[ "" ]] && echo "True"
(provalo!).
Va bene, quindi sembra che una stringa non vuota equivalga alla vera espressione e una stringa vuota (o una variabile non impostata) è equivalente alla falsa espressione.
Quello che hai fatto è il seguente:
[[ $var=="" ]]
e
[[ $var!="" ]]
così ti ha dato una stringa non vuota, il che è vero!
Per eseguire il test, è in realtà bisogno di spazi tra i gettoni:
[[ $var == "" ]]
invece. Ora, il tuo test sarebbe meglio scritto come:
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
(senza sub-shell e con un solo test).
C'è ancora qualcosa da dire sul tuo stile di scripting. Senza offesa, direi che è davvero pessimo:
Non utilizzare i backtick! Utilizzare invece il costrutto $(...)
. Quindi:
var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
Non utilizzare function blah
per definire una funzione.La funzione avrebbe dovuto essere definito come:
cpic() {
local var="$(export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } ')"
if [[ -z "$var" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
Oh, ho usato la parola chiave local
, perché immagino che tu non hai intenzione di utilizzare la var
esterno variabile della funzione cpic
.
Ora, qual è lo scopo della funzione cpic
e in particolare del materiale in cui si sta definendo la variabile var
? Sarebbe difficile da descrivere (poiché ci sono così tanti casi a cui non hai pensato). (A proposito, il tuo grep
sembra davvero inutile qui). Qui ci sono alcuni casi trascurato:
- Una variabile esportato viene denominato
somethingfunnyCPIC_MAX_CONVsomethingevenfunnier
Un esportato variabile contiene la stringa CPIC_MAX_CONV
da qualche parte, per esempio,
export a_cool_variable="I want to screw up Randhawa's script and just for that, let's write CPIC_MAX_CONV somewhere here"
Ok, I don' Voglio descrivere esattamente cosa sta facendo la tua linea, ma immagino che il tuo scopo sia sapere se la variabile CPIC_MAX_CONV
è impostata e contrassegnata per l'esportazione, giusto? In tal caso, starai meglio con questo:
cpic() {
if declare -x | grep -q '^declare -x CPIC_MAX_CONV='; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
Sarà più efficiente e molto più robusto.
Oh, ora sto solo leggendo la fine del tuo post. Se vuoi solo dire se è impostata la variabile CPIC_MAX_CONV
(ad un valore non vuoto - sembra che non ti interessi se è contrassegnata per l'esportazione o meno, correggimi se ho torto), è ancora più semplice (e lo sarà essere molto più efficiente):
cpic() {
if [[ "$CPIC_MAX_CONV" ]]; then
echo "Empty String <<"
else
echo "$CPIC_MAX_CONV"
fi
}
farà altrettanto!
penso di 'if' come un comando. Tutto ciò che segue sono argomenti separati da spazi, proprio come qualsiasi altro comando. –
@BarryBrown Per essere precisi, 'if' è una parola chiave:' type if' restituisce 'se è una parola chiave shell '. –
Perché non utilizzare la parola chiave 'function'? –