2010-07-21 12 views
16

Sto cercando di fare un semplice confronto per verificare se una linea è vuoto utilizzando bash:controllo se una linea è vuoto utilizzando bash

line=$(cat test.txt | grep mum) 
if [ "$line" -eq "" ] 
     then 
     echo "mum is not there" 
    fi 

Ma non funziona, si legge: [: troppi argomenti

Grazie mille per il vostro aiuto!

risposta

25

si potrebbe anche utilizzare la variabile $? che è impostato per lo stato di ritorno del comando. Così si avrebbe:

line=$(grep mum test.txt) 
if [ $? -eq 1 ] 
    then 
    echo "mum is not there" 
fi 

Per il comando grep se ci sono delle corrispondenze $? è impostato su 0 (uscito in modo pulito) e se non ci sono partite $? è 1.

+4

Si può anche solo fare 'se grep -q mamma test.txt; poi ... ' – Daenyth

+1

In questo specifico scenario questo lavoro, in effetti. Tuttavia, prova ad aggiungere un paio di pipe e vedi come funziona questa tecnica. – Anders

+1

@Anders, questa tecnica funziona perfettamente, presupponendo che si voglia testare lo stato di uscita dell'ultimo comando nella pipeline. –

8
if [ ${line:-null} = null ]; then 
    echo "line is empty" 
fi 

o

if [ -z "${line}" ]; then 
    echo "line is empty" 
fi 
+0

Questo modo errato linea flags = "null", come una linea vuota. – schot

+0

@schot, Sì, hai ragione, ed è per questo che ho incluso anche il secondo. Scegli una scelta arbitraria di un dato che sai che non si verificherà. Altrimenti basta selezionare la seconda opzione. Pike e Kernighan preferiscono la prima opzione in "L'ambiente di programmazione UNIX". – Anders

+0

Il secondo dovrebbe citare la variabile o usare '[[' (Si dovrebbe sempre usare '[[' quando si usa bash). Nel caso di '-z' funziona, ma per qualsiasi altro test, causerà un errore se la variabile è vuota. – Daenyth

5

La risposta sh classica che funziona anche in bash è

if [ x"$line" = x ] 
then 
    echo "empty" 
fi 

Il tuo problema potrebbe anche essere che si sta utilizzando 'eq', che è per il confronto aritmetica.

+0

Questo è il classico per conchiglie antiche, obsolete e rotte! Si prega di non utilizzare questo nel nuovo codice. –

4
grep "mum" file || echo "empty" 
+0

Non vuoi che l'output di grep mostri, quindi 'grep -q' – unbeli

4
if line=$(grep -s -m 1 -e mum file.txt) 
then 
    echo "Found line $line" 
else 
    echo 'Nothing found or error occurred' 
fi 
+0

Aggiungi' 2>/dev/null' o '-s' per sopprimere i messaggi di errore. –

1

Penso che la soluzione più chiara sta usando espressioni regolari:

if [[ "$line" =~ ^$ ]]; then 
    echo "line empty" 
else 
    echo "line not empty" 
fi 
-1

Se si desidera utilizzare PHP con questo,

$path_to_file='path/to/your/file'; 
$line = trim(shell_exec("grep 'mum' $path_to_file |wc -l")); 
if($line==1){ 
    echo 'mum is not here'; 
} 
else{ 
    echo 'mum is here'; 
} 
+0

perché qualcuno vorrebbe mai farlo? Inoltre, l'OP ha richiesto esplicitamente una risposta bash. – ntrp