2012-12-24 6 views
5

Prima ho eseguito lo script ho inseritoBash script sta tornando vero per entrambi ma stringa di fronte alla prova

# export CPIC_MAX_CONV=500 

Il seguente è il file test1.script

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var=="" ]] && (echo "Empty String <<") 
    [[ $var!="" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 

L'output è:

# test1.script ---- Me running the file 

Empty String << 
500 
CPIC_MAX_CONV="500" 

Non importa quello che uso "" o "" o [o [[il risultato è lo stesso. La variabile CPIC_MAX_CONV viene trovata dallo script precedente.

Sono in esecuzione su Linux/CentOS 6.3.

L'idea è semplice: per trovare se CPIC_MAX_CONV è definito nell'ambiente e restituire il valore di esso. Se c'è uno spazio vuoto, ovviamente la variabile non è presente nel sistema.

risposta

4

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!

+0

penso di 'if' come un comando. Tutto ciò che segue sono argomenti separati da spazi, proprio come qualsiasi altro comando. –

+0

@BarryBrown Per essere precisi, 'if' è una parola chiave:' type if' restituisce 'se è una parola chiave shell '. –

+0

Perché non utilizzare la parola chiave 'function'? –

1

Ti interessa davvero se CPIC_MAX_CONV è una variabile di ambiente rispetto a "è una variabile che potrebbe essere una variabile di ambiente"? Molto probabilmente, non lo farai, non ultimo perché se è una variabile ma non una variabile d'ambiente, qualsiasi script eseguito non vedrà il valore (ma se insisti a usare alias e funzioni, allora potrebbe essere importante, ma comunque probabilmente non lo farà).

Appare quindi che si sta tentando di verificare se CPIC_MAX_CONV è impostato su un valore non vuoto. Ci sono diversi modi semplici per farlo - e poi c'è il modo in cui hai provato.

: ${CPIC_MAX_CONV:=500} 

Ciò garantisce che CPIC_MAX_CONV sia impostato su un valore non vuoto; usa 500 se prima non c'era un valore impostato. Il comando : (due punti) valuta i suoi argomenti e segnala il successo. È possibile organizzare esportare la variabile dopo che è stata creata se si desidera con export CPIC_MAX_CONV.

Se è necessario che la variabile (non v'è alcun valore predefinito adatto), quindi si utilizza:

: ${CPIC_MAX_CONV:?} 

o

: ${CPIC_MAX_CONV:?'The CPIC_MAX_CONV variable is not set but must be set'} 

La differenza è che è possibile utilizzare il messaggio predefinito (' CPIC_MAX_CONV: parametro null o non impostato ') o specificare il proprio.

Se si sta solo andando a utilizzare il valore una volta, si può fare un 'on the fly' Sostituzione in un comando con:

cpic_command -c ${CPIC_MAX_CONV:-500} ... 

Questo non crea la variabile se non esiste, a differenza della notazione := che lo fa.

In tutte queste annotazioni, ho utilizzato i due punti come parte dell'operazione. Questo impone "nulla o non impostato"; è possibile omettere i due punti, ma ciò consente una stringa vuota come valore valido, che probabilmente non è ciò che si desidera. Si noti che una stringa che consiste solo di uno spazio vuoto è 'non vuota'; se hai bisogno di verificare che tu abbia una stringa non vuota, devi lavorare un po 'di più.


Non sto sezionare il vostro uso improprio del comando [[; gniourf_gniourf ha fornito un eccellente deconstruction, ma ha trascurato le più semplici notazioni disponibili per fare quello che sembra essere il lavoro.

+0

Buon punto! '+ 1' –

-1

Hai bisogno di spazi nelle tue condizioni.

#!/bin/bash 

function cpic() { 
    var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`" 
    [[ $var == "" ]] && (echo "Empty String <<") 
    [[ $var != "" ]] && (echo "$CPIC_MAX_CONV") 
    echo "$var" ; 
} 

cpic 
+0

Non sono sicuro che la tua risposta aggiunga qualcosa di interessante agli altri. Inoltre, si lasciano tutti gli errori che l'OP ha (uso di backtick, uso di subshells inutili, uso inutile di 'grep', uso deprecato della parola chiave' function', forse non il miglior algoritmo per ottenere ciò che sta cercando di ottenere). '-1'. –

+0

Senza offesa, ma ho risposto all'argomento della domanda. Il PO non chiedeva le migliori pratiche di codifica qui. –

+0

Nessun reato. Quindi, almeno, spiega perché il richiedente ha ottenuto questo risultato piuttosto confuso. –

0

Prova questo:

#!/bin/bash 
function cpic() {  
    var="`export | grep -i "CPIC_MAX_CONV"`" 
    [ "$var" = "" ] && (echo "Empty String <<") 
    [ "$var" != "" ] && echo "$CPIC_MAX_CONV" 
} 
cpic 
+0

Qual è il punto nel rispondere a una domanda e non fornire alcuna nuova informazione di sorta? –