2010-07-21 13 views
16

Ich versuche, einen einfachen Vergleich zu tun, um zu überprüfen, ob eine Zeile leer ist mit bash:überprüfen, ob eine Zeile leer ist mit bash

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

Aber es funktioniert nicht, heißt es: [: zu viele Argumente

Vielen Dank für Ihre Hilfe!

Antwort

25

könnten Sie auch die $? Variable verwenden, die der Rückgabestatus des Befehls gesetzt. So müssten Sie:

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

Für den grep Befehl, wenn es irgendwelche Übereinstimmungen $?-0 (verlassen sauber) gesetzt ist, und wenn es keine Spiele $? ist 1.

+4

Sie können auch einfach 'grep -q mum test.txt; dann ... ' – Daenyth

+1

In diesem speziellen Szenario diese Arbeit in der Tat. Versuchen Sie jedoch, ein paar Pfeifen hinzuzufügen und sehen Sie, wie gut diese Technik funktioniert. – Anders

+1

@Anders, diese Technik funktioniert perfekt, vorausgesetzt, Sie möchten den Exit-Status des letzten Befehls in der Pipeline testen. –

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

oder

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

Diese falsch Flags line = "null" als eine leere Zeile. – schot

+0

@schot, Ja, du hast recht, weshalb ich auch die zweite aufgenommen habe. Wählen Sie eine beliebige Auswahl einer Dateneingabe, von der Sie wissen, dass sie nicht auftritt. Ansonsten wähle einfach die zweite Option. Pike und Kernighan bevorzugen die erste Option in "The UNIX Programming Environment". – Anders

+0

Die zweite sollte entweder die Variable zitieren oder '[[' (Sie sollten immer '[[' verwenden, wenn bash verwenden). Im Fall von "-z" funktioniert es, aber für jeden anderen Test wird ein Fehler verursacht, wenn die Variable leer ist. – Daenyth

5

Die klassische sh Antwort, die wird auch in bash arbeitet, ist

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

Ihr Problem auch, dass Sie ‚eq‘ verwenden könnte, die für arithmetischen Vergleich ist.

+0

Dies ist die klassische für alte, veraltete und gebrochene Muscheln! Bitte verwenden Sie dies nicht in neuem Code. –

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

Sie möchten nicht, dass Grep-Ausgabe angezeigt wird, also '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

Fügen Sie' 2>/dev/null' oder '-s' hinzu, um Fehlermeldungen zu unterdrücken. –

1

Ich denke, die klarste Lösung regex verwendet:

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

Wenn Sie PHP mit diesem verwenden möchten,

$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

Warum sollte jemand das jemals tun wollen? Zusätzlich hat das OP explizit eine Bash-Antwort angefordert. – ntrp