Al intentar buscar un patrón simple "hola" en un archivo, todas las siguientes formas de grep funcionan:
- grep hello file1
- grep 'hola' archivo1
- grep "hola" archivo1
¿Existe un caso específico en el que uno de los formularios anteriores funcione pero otros no? ¿Hay alguna diferencia si uso uno en lugar de otro?
$
es el final de línea en una expresión regular, por lo$VAR1
que nunca debería coincidir con nada. Resulta que funciona en GNU grep, pero todavía no contaría con ese comportamiento. Tendría que\$VAR1
hacer coincidir con seguridad la cadena literal. (Y necesitaría barras diagonales adicionales si está entre comillas dobles)James tiene razón, pero para agregar más datos, creo que la mejor manera de pensarlo es como argumentos del comando: ¿pretendes que "hola" y "mundo" sean dos argumentos o que "hola mundo" sea uno argumento.
Además, las comillas dobles permiten interpretar más que solo variables. Exactamente lo que depende de su shell, pero verifique la expansión del historial, la expansión de llaves y la expansión del nombre de archivo.
También es importante tener en cuenta que hay algunos casos en los que necesita usar ambos tipos de comillas en un solo argumento. Recuerde que (por defecto) los argumentos están delimitados por espacios en blanco, por lo que si no deja ningún espacio, todavía está especificando el mismo argumento.
El mecanismo de comillas simples de la mayoría de los shells no permite ningún carácter especial, lo que significa que cualquier instancia de otra cita simple, incluso si parece haber escapado, finaliza la cita. Por lo tanto, es imposible pasar una cadena con una comilla simple dentro de una cadena de comillas simples, y debe usar comillas dobles. Esto puede ser una molestia cuando desea pasar un argumento que contiene comillas simples y algo que se interpretaría, pero no quiere serlo. Por ejemplo, si desea pasar la cadena literal "` '$ VAR' es una variable ", debe hacerlo de esta manera:
Eso es en realidad una concatenación de tres cadenas entre comillas:
o, con las comillas eliminadas:
En realidad, con la mayoría de los proyectiles, también podría hacerlo de esta manera:
donde la barra diagonal inversa ("
\
") le dice al shell que acepte el siguiente carácter literalmente y que no realice ninguna expansión en él.Pero hay algunos casos en los que terminas teniendo que hacerlo de la forma de concatenación de cadenas múltiples, no es que realmente pueda encontrar un ejemplo en este momento.
fuente