22 votos

¿Cuál es la diferencia entre grep archivo de apple y grep "apple" archivo?

¿Cuál es la diferencia entre grep apple file y grep "apple" file? Lo hace poniendo las comillas? Ambos aparecen de trabajar y de hacer exactamente lo mismo (visualización de la misma línea).

45voto

David Foerster Puntos 6294

Las comillas tienen un efecto sobre lo que los personajes de su shell considera especial y tener un significado sintáctico. En su ejemplo, esto no marca una diferencia, porque apple no contiene caracteres.

Pero consideremos otro ejemplo: grep apple tree file va a la búsqueda de la palabra apple en los archivos tree y file, mientras que grep "apple tree" file va a la búsqueda de la palabra apple tree en el archivo file. Las comillas decirle a bash, que la palabra espacio en "apple tree" no se inicia un nuevo parámetro, pero será parte de la actual parámetro. grep apple\ tree file produciría el mismo resultado, porque \ dice bash a ignorar el significado especial de los siguientes caracteres y tratar literalmente.

23voto

AsymLabs Puntos 441

Comillas dobles permiten la evaluación, las comillas simples prevenir evaluaton, sin comillas permitir la expansión de comodines, cuando se utiliza en la línea de comandos. Como artificioso ejemplos:

[user@work test]$ ls .
A.txt B.txt C.txt D.cpp

# The following is the same as writing echo 'A.txt B.txt C.txt D.cpp'
[user@work test]$ echo *
A.txt B.txt C.txt D.cpp

[user@work test]$ echo "*"
*

[user@work test]$ echo '*'
*

# The following is the same as writing echo 'A.txt B.txt C.txt'
[user@work test]$ echo *.txt
A.txt B.txt C.txt

[user@work test]$ echo "*.txt"
*.txt

[user@work test]$ echo '*.txt'
*.txt

[user@work test]$ myname=is Fred; echo $myname
bash: Fred: command not found

[user@work test]$ myname=is\ Fred; echo $myname
is Fred

[user@work test]$ myname="is Fred"; echo $myname
is Fred

[user@work test]$ myname='is Fred'; echo $myname
is Fred

La comprensión de la forma en que las comillas de trabajo es fundamental para la comprensión de Bash. Por ejemplo:

# for will operate on each file name separately (like an array), looping 3 times.
[user@work test]$ for f in $(echo *txt); do echo "$f"; done;
A.txt
B.txt
C.txt

# for will see only the string, 'A.txt B.txt C.txt' and loop just once.
[user@work test]$ for f in "$(echo *txt)"; do echo "$f"; done;
A.txt B.txt C.txt

# this just returns the string - it can't be evaluated in single quotes.
[user@work test]$ for f in '$(echo *txt)'; do echo "$f"; done;
$(echo *txt)

Usted puede usar comillas simples para pasar un comando a través de una variable. Las comillas simples evitará la evaluación. Las comillas dobles evaluar.

# This returns three distinct elements, like an array.
[user@work test]$ echo='echo *.txt'; echo $($echo)
A.txt B.txt C.txt

# This returns what looks like three elements, but it is actually a single string.
[user@work test]$ echo='echo *.txt'; echo "$($echo)"
A.txt B.txt C.txt

# This cannot be evaluated, so it returns whatever is between quotes, literally.
[user@work test]$ echo='echo *.txt'; echo '$($echo)'
$($echo)

Puede utilizar comillas dentro de comillas dobles y se puede utilizar comillas dentro de comillas dobles, pero comillas dentro de comillas simples no se debe hacer (sin escapar de ellos) no serán evaluados, que va a ser interpretado literalmente. Solo comillas dentro de comillas simples no se debe hacer (sin escapar de ellos).

Usted necesitará obtener un conocimiento profundo de la cita a usar Bash de forma efectiva. Muy importante!

Como regla general, yo no uso las comillas si quiero Bash para ampliar algo en elementos (como una matriz), yo use comillas simples para las cadenas literales que no deben alterarse, y me hacen un uso liberal de las comillas dobles para las variables que son propensos a la devolución de cualquier tipo de cadena. Esto es para asegurar que los espacios y caracteres especiales serán preservados.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: