2010-07-21 11 views
16

estoy tratando de hacer una comparación sencilla de comprobar si una línea está vacía usando bash:verificación si una línea está vacía utilizando fiesta

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

Pero no está funcionando, que dice: [: demasiados argumentos

¡Muchas gracias por su ayuda!

Respuesta

25

También puede utilizar la variable $? que se establece en el estado de retorno del comando. Por lo que tendría:

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

Para el comando grep si hay coincidencias $? se establece en 0 (salido limpiamente) y si no hay coincidencias $? 1.

+4

También puede hacer 'grep -q mum test.txt; entonces ... ' – Daenyth

+1

En este escenario específico este trabajo, de hecho. Sin embargo, intente agregar un par de tubos y ver qué tan bien funciona esta técnica. – Anders

+1

@Anders, esa técnica funciona perfectamente bien, suponiendo que desea probar el estado de salida del último comando en la tubería. –

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

o

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

Esta forma incorrecta banderas line = "nulo", como una línea vacía – schot

+0

@schot, sí, estás en lo cierto, por eso también incluí el segundo. Elija una opción arbitraria de una entrada de datos que sabe que no ocurrirá. De lo contrario, simplemente seleccione la segunda opción. Pike y Kernighan prefieren la primera opción en "El entorno de programación de UNIX". – Anders

+0

El segundo debe citar la variable o usar '[[' (Siempre debe usar '[[' cuando se usa bash). En el caso de '-z' funciona, pero para cualquier otra prueba, causará un error si la variable está vacía. – Daenyth

5

La respuesta clásica que sh también funcionará en bash es

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

Su problema también podría ser que está utilizando 'eq', que es para la comparación aritmética.

+0

¡Este es el clásico para conchas antiguas, obsoletas y rotas! Por favor, no use esto en el nuevo código. –

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

No desea que se muestre la salida grep, por lo que '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

Agregue' 2>/dev/null' o '-s' para suprimir los mensajes de error. –

1

Creo que la solución más clara está usando expresiones regulares:

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

Si desea utilizar PHP con esto,

$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

¿por qué alguien querría hacer eso? Además, el OP solicitó explícitamente una respuesta bash .. – ntrp

Cuestiones relacionadas