2010-07-21 5 views
16

Je suis en train de faire une comparaison simple pour vérifier si une ligne est vide à l'aide bash:vérifier si une ligne est vide à l'aide bash

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

Mais il ne fonctionne pas, il est dit: [: trop d'arguments

Merci beaucoup pour votre aide!

Répondre

25

Vous pouvez également utiliser la variable $? qui est réglé sur l'état de retour de la commande. Donc, vous auriez:

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

Pour la commande grep s'il y a des matchs $? est mis à 0 (proprement sorti) et s'il n'y a pas $? matchs est 1.

+4

Vous pouvez aussi faire 'si grep -q mum test.txt; alors ... ' – Daenyth

+1

Dans ce scénario spécifique ce travail, en effet. Cependant, essayez d'ajouter quelques tuyaux et voyez comment cette technique fonctionne. – Anders

+1

@Anders, cette technique fonctionne parfaitement, en supposant que vous voulez tester le statut de sortie de la dernière commande dans le pipeline. –

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

ou

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

Cette ligne de manière incorrecte flags = "null" comme une ligne vide. – schot

+0

@schot, Oui, vous avez raison, c'est pourquoi j'ai inclus le second aussi. Choisissez un choix arbitraire d'une entrée de données dont vous savez qu'elle ne se produira pas. Sinon, sélectionnez simplement la deuxième option. Pike et Kernighan préfèrent la première option dans "L'environnement de programmation UNIX". – Anders

+0

Le second devrait soit citer la variable ou utiliser '[[' (Vous devez toujours utiliser '[[' bash lors de l'utilisation). Dans le cas de '-z' cela fonctionne, mais pour tout autre test, cela provoquera une erreur si la variable est vide. – Daenyth

5

La réponse de poisson classique qui travaillera également en bash est

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

Votre problème pourrait également que vous utilisez « -eq » qui est pour la comparaison arithmétique.

+0

C'est le classique pour les coquilles anciennes, obsolètes et cassées! Merci de ne pas l'utiliser dans un nouveau code. –

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

Vous ne voulez pas que la sortie grep s'affiche, donc '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

Ajoutez' 2>/dev/null' ou '-s' pour supprimer les messages d'erreur. –

1

Je pense que la plus claire solution utilise regex:

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

Si vous souhaitez utiliser PHP avec cela,

$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

pourquoi voudrait-on jamais faire ça? De plus, l'OP a explicitement demandé une réponse bash. – ntrp

Questions connexes